Les types de données et les différences entre eux sont dans la documentation . La version courte est :
- DATE a une précision d'une seconde sans prise en charge du fuseau horaire ;
- TIMESTAMP a une précision jusqu'à des fractions de seconde (jusqu'à neuf décimales, mais votre système d'exploitation affecte également cela), toujours sans prise en charge du fuseau horaire ;
- TIMESTAMP WITH TIME ZONE a la même précision que TIMESTAMP mais prend également en charge le fuseau horaire, comme son nom l'indique ;
- TIMESTAMP WITH LOCAL TIME ZONE ajuste la valeur stockée vers et depuis le fuseau horaire local de la session de création/interrogation.
Vous pourriez trouver cet article intéressant aussi.
Chaque fois que vous comparez des valeurs datetime stockées dans votre base de données, vous devez utiliser des valeurs du même type de données à comparer. Vous ne voulez pas avoir à convertir chaque valeur de la colonne à des fins de comparaison, surtout si la colonne est indexée. Si vous avez une colonne DATE, comparez avec une DATE - ne comparez pas comme une chaîne et ne vous fiez pas à conversion d'une chaîne. Lorsque vous faites :
WHERE date_col BETWEEN '01-JAN-1990' AND '01-JAN-2000'
vous comptez sur votre NLS_DATE_FORMAT étant DD-MON-YYYY et votre NLS_DATE_LANGUAGE étant l'anglais. Si quelqu'un d'autre exécute la même requête dans une autre session, ses paramètres peuvent entraîner l'échec de la requête (ou, dans certains cas, donner des résultats erronés, ce qui peut être pire). Pour éviter le problème de langue, il est préférable d'utiliser des numéros de mois plutôt que des noms. Si vous avez une variable de chaîne à comparer, vous devez utiliser TO_DATE()
pour convertir la chaîne en une DATE à l'aide d'un masque de format connu fixe - ne vous fiez pas à NLS. Si vous avez une valeur fixe, vous pouvez faire de même, ou vous pouvez utiliser un littéral de date
, qui est plus court et sans ambiguïté.
Avec le format que vous avez utilisé, vous incluez également toutes les lignes dont la colonne est définie sur minuit le 1er janvier 2000, mais pas plus tard ce jour-là. C'est peut-être ce que vous voulez, mais assurez-vous de comprendre comment BETWEEN
œuvres. Si vous recherchez réellement des dates au cours de cette décennie, y compris à tout moment le 31 décembre 1999, vous pouvez utiliser :
WHERE date_col >= DATE '1990-01-01' AND date_col < DATE '2000-01-01'
Pour les horodatages, vous pouvez soit utiliser TO_TIMESTAMP()
ou un littéral d'horodatage :
WHERE ts_col >= TIMESTAMP '1990-01-01 00:00:00'
AND ts_col < TIMESTAMP '2000-01-01 00:00:00'
Pour les horodatages avec fuseaux horaires, vous pouvez soit utiliser TO_TIMESTAMP_TZ()
ou un littéral d'horodatage, avec une région de fuseau horaire :
WHERE tstz_col >= TIMESTAMP '1990-01-01 00:00:00 America/New_York'
AND tstz_col < TIMESTAMP '2000-01-01 00:00:00 America/New_York'