Monday, July 14, 2008

[pgsql-fr-generale] Question de dates

La gestion des dates est une source de cas d'école. En regardant le
résultat d'une requête j'ai été quelque peu surpris par le résultat d'un
tri sur intervalle de temps. (PG 8.3.3)

La table et les données suivantes permettent de recréer le cas.

CREATE TABLE test
(
id serial PRIMARY KEY,
utc timestamp without time zone
) ;

INSERT INTO test ( utc ) VALUES
( '2008-05-16 08:06:04' ),
( '2008-05-14 20:05:26' ),
( '2008-05-13 20:06:16' );

Soit:

=# SELECT * FROM test ;
id | utc
----+---------------------
1 | 2008-05-16 08:06:04
2 | 2008-05-14 20:05:26
3 | 2008-05-13 20:06:16
(3 rows)


Un tri sur la colonne _utc_ donne fort logiquement le résultat suivant:

=# SELECT id, utc, age( utc ) AS a FROM test ORDER BY utc ;
id | utc | a
----+---------------------+------------------------
3 | 2008-05-13 20:06:16 | 2 mons 03:53:44
2 | 2008-05-14 20:05:26 | 1 mon 30 days 03:54:34
1 | 2008-05-16 08:06:04 | 1 mon 28 days 15:53:56
(3 rows)


Le même tri mais sur la colonne _a_ (différence entre la date actuelle
et l'argument donné dont le résultat est un type interval) devrait
donner le résultat strictement inverse (Id: 1, 2, 3), mais:

=# SELECT id, utc, age( utc ) AS a FROM test ORDER BY a ;
id | utc | a
----+---------------------+------------------------
1 | 2008-05-16 08:06:04 | 1 mon 28 days 15:53:56
3 | 2008-05-13 20:06:16 | 2 mons 03:53:44
2 | 2008-05-14 20:05:26 | 1 mon 30 days 03:54:34
(3 rows)
remarque: age( timestamp ), est équivalent à: age( now()::date, timestamp ).

le résultat est plutôt insolite en ceci qu'il montre un intervalle de
temps de 2 mois (id 3) situé entre deux intervalles de temps plus petit.

Question:
Quelle est l'interprétation (logique?) à cet ordre en désordre ?


--
Sent via pgsql-fr-generale mailing list (pgsql-fr-generale@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-fr-generale

No comments: