Nota al margen/EXENCIÓN DE RESPONSABILIDAD:
Esta es una mala idea, dado que el momento de la creación de la tabla no es 100 % confiable, ya que la tabla puede haberse descartado y recreado internamente debido a operaciones en la tabla, como CLUSTER.
Aparte de eso, puede obtener el tiempo de creación de esta manera (suponiendo que el nombre de la tabla de ejemplo 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')
El secreto es usar pg_stat_file en el archivo de tabla respectivo.
-- 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('.');
Según el comentario en esta publicación PostgreSQL:tiempo de creación de la tabla esto no es 100% confiable, porque la tabla puede haber sido eliminada y recreada internamente debido a operaciones en la tabla, como CLUSTER.
También el patrón
/main/base/<database id>/<table filenode id>
parece estar mal, ya que en mi máquina, todas las tablas de diferentes bases de datos tienen la misma identificación de base de datos, y parece que la carpeta ha sido reemplazada con un número de inodo arbitrario, por lo que necesita encontrar la carpeta cuyo número es más cercano al de su tabla ID de inodo (nombre de carpeta máximo donde ID de carpeta <=table_inode_id y nombre de carpeta es numérico)
La versión simplificada dice así:
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')
)
Luego puede usar information_schema y cte para simplificar la consulta o crear su propia vista:
;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 las tablas creadas con nhibernate schema create, por lo que el tiempo más o menos igual en todas las tablas en la captura de pantalla es correcto).
Para riesgos y efectos secundarios, use su cerebro y/o pregunte a su médico o farmacéutico;)