Странична бележка/ОТКАЗ ОТ ОТГОВОРНОСТ:
Това е лоша идея, тъй като времето за създаване на таблица не е 100% надеждно, тъй като таблицата може да е била вътрешно премахната и пресъздадена поради операции върху таблицата, като например CLUSTER.
Освен това можете да получите времето за създаване по този начин (приемайки име на примерна-таблица на t_benutzer
):
--select datname, datdba from pg_database;
--select relname, relfilenode from pg_class where relname ilike 't_benutzer';
-- (select relfilenode::text from pg_class where relname ilike 't_benutzer')
SELECT
pg_ls_dir
,
(
SELECT creation
FROM pg_stat_file('./base/'
||
(
SELECT
MAX(pg_ls_dir::bigint)::text
FROM pg_ls_dir('./base')
WHERE pg_ls_dir <> 'pgsql_tmp'
AND pg_ls_dir::bigint <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE 't_benutzer')
)
|| '/' || pg_ls_dir
)
) as createtime
FROM pg_ls_dir(
'./base/' ||
(
SELECT
MAX(pg_ls_dir::bigint)::text
FROM pg_ls_dir('./base')
WHERE pg_ls_dir <> 'pgsql_tmp'
AND pg_ls_dir::bigint <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE 't_benutzer')
)
)
WHERE pg_ls_dir = (SELECT relfilenode::text FROM pg_class WHERE relname ILIKE 't_benutzer')
Тайната е да използвате pg_stat_file в съответния файл с таблица.
-- http://www.greenplumdba.com/greenplum-dba-faq/howtofindtablecreationdateingreenplum
select
pg_ls_dir
,
(
select
--size
--access
--modification
--change
creation
--isdir
from pg_stat_file(pg_ls_dir)
) as createtime
from pg_ls_dir('.');
Според коментар в тази публикация PostgreSQL:Време за създаване на таблица това не е 100% надеждно, защото таблицата може да е била вътрешно премахната и пресъздадена поради операции върху таблицата, като например CLUSTER.
Също и моделът
/main/base/<database id>/<table filenode id>
изглежда грешно, тъй като на моята машина всички таблици от различни бази данни имат един и същ идентификатор на база данни и изглежда, че папката е заменена с произволен номер на inode, така че трябва да намерите папката, чийто номер е най-близо до тази на вашата таблица inode id (макс. име на папка, където folderid <=table_inode_id и името на папката е числово)
Опростената версия изглежда така:
SELECT creation
FROM pg_stat_file(
'./base/'
||
(
SELECT
MAX(pg_ls_dir::bigint)::text
FROM pg_ls_dir('./base')
WHERE pg_ls_dir <> 'pgsql_tmp'
AND pg_ls_dir::bigint <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE 't_benutzer')
)
|| '/' || (SELECT relfilenode::text FROM pg_class WHERE relname ILIKE 't_benutzer')
)
След това можете да използвате information_schema и cte, за да опростите заявката, или да създадете свой собствен изглед:
;WITH CTE AS
(
SELECT
table_name
,
(
SELECT
MAX(pg_ls_dir::bigint)::text
FROM pg_ls_dir('./base')
WHERE pg_ls_dir <> 'pgsql_tmp'
AND pg_ls_dir::bigint <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE table_name)
) as folder
,(SELECT relfilenode FROM pg_class WHERE relname ILIKE table_name) filenode
FROM information_schema.tables
WHERE table_type = 'BASE TABLE'
AND table_schema = 'public'
)
SELECT
table_name
,(
SELECT creation
FROM pg_stat_file(
'./base/' || folder || '/' || filenode
)
) as creation_time
FROM CTE
(всички таблици, създадени с nhibernate schema create, така че повече или по-малко същото време за всички таблици на екранната снимка е правилно).
За риск и странични ефекти използвайте мозъка си и/или попитайте Вашия лекар или фармацевт;)