J'ai un champ de type DATE DB2 dans une table DB2 .. Je veux sélectionner des données par un filtre de date. Par exemple:
SELECT *
FROM table
WHERE registrationdate > '2002-10-01';
À partir de la requête ci-dessus, j’obtiens des enregistrements avec registrationdate à partir du '1943-10-01', mais c’est inexact.
Ceux-ci ne fonctionnent pas non plus:
registrationdate > date('2002-10-01')
date(registrationdate) > date('2002-10-01')
date(registrationdate) > '2002-10-01'
Comment dois-je comparer les dates?
J'ai exploré d'autres problèmes avec la base de données, après le redémarrage, cela a commencé à fonctionner, donc cela fonctionne correctement maintenant:
registrationdate > '2002-10-01'
Le format standard SQL d'un littéral DATE est le suivant:
DATE '2002-10-01'
À tout le moins, cela vaut la peine d'essayer:
SELECT *
FROM table
WHERE registrationdate > DATE '2002-10-01';
Le format par défaut utilisé pour les dates est déterminé par le code de territoire de DB2 database (qui peut être spécifié au moment de la création de la base de données). Par exemple, ma base de données a été créée à l’aide de Territory = US. Par conséquent, le format de date ressemble à ceci:
values current date
1
----------
05/30/2003
1 record(s) selected.
Vous pouvez obtenir le code de territoire auprès de DB CFG.
db2 get db cfg | egrep 'code|territory'
Database territory = US
Database code page = 1208
Database code set = UTF-8
Database country/region code = 1
C'est-à-dire que le format est MM/JJ/AAAA . Si vous souhaitez modifier le format, vous pouvez lier la collection de packages d'utilitaires db2 afin d'utiliser un format de date différent.
Pour obtenir la date actuelle, l'heure et l'horodatage à l'aide de SQL, (vous donne en gros une idée du format de la date), référencez les registres DB2 appropriés: Le sysibm.sysdummy1 table est une mémoire spéciale. table pouvant être utilisée pour découvrir la valeur des registres DB2
db2 "SELECT current date FROM sysibm.sysdummy1 "
1
----------
06/02/2014
1 record(s) selected.
La fonction DATE fonctionne toujours même si nous omettons les guillemets dans la fonction, mais le résultat n'est pas correct:
db2 "SELECT date(2001-09-22) FROM sysibm.sysdummy1 "
1
----------
05/24/0006
1 record(s) selected.
Lorsque la fonction DATE obtient une chaîne de caractères en entrée, elle suppose qu'il s'agit d'une représentation de caractère valide d'une date DB2 et la convertit en conséquence. En revanche, lorsque l'entrée est numérique, la fonction suppose qu'elle représente le nombre de jours moins un à partir du début de l'ère actuelle (c'est-à-dire 0001-01-01). Dans la requête ci-dessus, l'entrée était 2001-09-22, ce qui équivaut à (2001-9) -22, ce qui équivaut à 1970 jours.
Et si tout ce qui précède est applicable, la commande ci-dessous devrait fonctionner correctement pour votre problème.
SELECT * FROM table WHERE registrationdate > '10/01/2002';
Utilisez ce format.
registrationdate > 'mm/dd/yyyy'