PostgreSQL: entre avec datetime
J'utilise PostgreSQL 8.4.11 et trouver étrange erreur. Quand j'ai une requête:
SELECT "documents_document"."given_on"
FROM "documents_document"
WHERE (EXTRACT('month' FROM "documents_document"."given_on") = 1
AND "documents_document"."given_on"
BETWEEN '1-01-01 00:00:00' and '1-12-31 23:59:59.999999')
ORDER BY "documents_document"."created_on" DESC
J'obtiens des résultats:
given_on
------------
2002-01-16
2011-01-25
2012-01-12
2012-01-12
2012-01-12
2012-01-20
2012-01-19
2012-01-13
2012-01-31
2012-01-16
2012-01-31
2012-01-12
...
Pourquoi?
Je m'attends à des dates dans l'intervalle 1-01-01 ... 1-12-31.
OriginalL'auteur Denis SkS | 2012-09-14
Vous devez vous connecter pour publier un commentaire.
Vous attend
1-01-01 ... 1-12-31
... mais comment est-PostgreSQL censé savoir ce que vous voulez dire par là?Littéraux de chaîne sont interprétés en fonction de vos paramètres régionaux, en particulier
lc_time
lors de la coulée detimestamp
oudate
. Je cite le manuel ici:Dans votre cas, les mutilés timestamp littérale
1-12-31 23:59:59
est évidemment interprété comme:Alors que vous auriez espéré:
3 options
Ensemble
lc_time
à des paramètres régionaux qui interprète un tel littéral de la même manière que vous le faites. Pas sûr qu'il y en est un.Utilisation
to_timestamp()
d'interpréter la chaîne littérale dans un sens bien défini de façon indépendante de la localisation en cours. Beaucoup mieux.Mieux encore, utilisez format ISO 8601 (
YYYY-MM-DD
) pour tous les littéraux datetime. C'est sans ambiguïté avec les paramètres régionaux..Réécriture de la requête
Enfin, votre requête est défectueux. Traiter tout un éventail de requête différemment. Réécriture de la requête:
Ou, plus simple encore:
La nouvelle gamme de types de PostgreSQL 9.2 peuvent être d'intérêt pour vous.
OriginalL'auteur Erwin Brandstetter
SELECT '1-12-31 23:59:59.999999'::timestamp;
retourne2031-01-12 23:59:59.999999
, apparemment Postgres ne pas envisager l'année-sans-siècle comme premier élément dans la date.OriginalL'auteur lanzz
Vous n'avez pas dit quel format que vous vouliez. De sorte qu'il donne en retour, le format natif. Peut-être vous même supposé que tout le monde désigne temps comme vous le faites?
Avoir un regard sur les formats possibles. http://www.postgresql.org/docs/8.2/static/functions-formatting.html
OriginalL'auteur Sjuul Janssen