Sidenote/DISCLAIMER:
Esta é uma má idéia, já que o tempo de criação da tabela não é 100% confiável, porque a tabela pode ter sido descartada e recriada internamente devido a operações na tabela, como CLUSTER.
Além disso, você pode obter o tempo de criação assim (assumindo o nome da tabela de exemplo de
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')
O segredo é usar pg_stat_file no respectivo arquivo de tabela.
-- 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('.');
Conforme comentário neste post PostgreSQL:tempo de criação da tabela isso não é 100% confiável, porque a tabela pode ter sido descartada e recriada internamente devido a operações na tabela, como CLUSTER.
Também o padrão
/main/base/<database id>/<table filenode id>
parece estar errado, pois na minha máquina, todas as tabelas de bancos de dados diferentes têm o mesmo id de banco de dados e parece que a pasta foi substituída por algum número de inode arbitrário, então você precisa encontrar a pasta cujo número está mais próximo da sua tabela ID do inode (max foldername onde folderid <=table_inode_id e foldername é numérico)
A versão simplificada fica assim:
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')
)
Em seguida, você pode usar information_schema e cte para simplificar a consulta ou criar sua própria visualização:
;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
(todas as tabelas criadas com o esquema nhibernate criam, portanto, o tempo mais ou menos igual em todas as tabelas na captura de tela está correto).
Para riscos e efeitos colaterais, use seu cérebro e/ou pergunte ao seu médico ou farmacêutico;)