2012-05-28 5 views
10

J'ai un champ de type DB2 DATE dans une table DB2. Je veux sélectionner les données par un filtre de date. Par exemple:Comparaison des dates DB2

SELECT * 
FROM table 
WHERE registrationdate > '2002-10-01'; 

de la requête ci-dessus, je reçois des enregistrements avec registrationdate à partir de « 01.10.1943 », ce qui est faux.

Ceux-ci ne fonctionnent pas non plus:

registrationdate > date('2002-10-01') 
date(registrationdate) > date('2002-10-01') 
date(registrationdate) > '2002-10-01' 

Comment puis-je besoin de comparer les dates?

+1

Comment est la colonne "registrationdate" définie? Peut-être que le type de données de la colonne n'est pas une date, si c'était le cas, alors votre requête d'origine aurait dû fonctionner. – NealB

Répondre

3

J'exploré d'autres problèmes avec la base de données, après le redémarrage, il a commencé pour fonctionner, donc cela fonctionne correctement maintenant:

registrationdate > '2002-10-01' 
13

Le format standard SQL pour une date littérale est:

DATE '2002-10-01' 

À tout le moins, il vaut la peine d'essayer:

SELECT * 
    FROM table 
WHERE registrationdate > DATE '2002-10-01'; 
+0

si registrationdate est défini comme horodatage, dites simplement timestamp'2012-12-21 ' – fedvasu

0

Utilisez ce format.

registrationdate > 'mm/dd/yyyy' 
+0

En supposant que 'registrationDate' _is_ est un type de date, la modification du format n'aura aucun effet. Si c'est quelque chose comme un type de char, cela ** ne fonctionnera pas du tout ** - le format que vous avez choisi ne fonctionne pas bien. ISO est le format standard recommandé pour une raison. –

3

Le format par défaut utilisé pour les dates est déterminée par le code du territoire de la base de données DB2 (qui peut être spécifié au moment de la création de bases de données). Par exemple, ma base de données a été créée en utilisant territory = US. Par conséquent le format de date ressemble à ce qui suit:

values current date 
1 
---------- 
05/30/2003 

1 record(s) selected. 

Vous pouvez obtenir le code de territoire à partir 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, le format est MM/JJ/AAAA. Si vous souhaitez modifier le format, vous pouvez lier la collection de packages d'utilitaires db2 pour utiliser un format de date différent.

Pour obtenir la date, l'heure et l'horodatage en utilisant SQL, (vous donne essentiellement une idée de ce que le format de la date est) référencent les registres DB2 appropriés: Le tableau sysibm.sysdummy1 est une en mémoire spéciale table qui peut être utilisé 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 laissons les guillemets dans la fonction, mais le résultat est incorrect:

db2 "SELECT date(2001-09-22) FROM sysibm.sysdummy1 " 

1 
---------- 
05/24/0006 

    1 record(s) selected. 

Lorsque la fonction DATE reçoit 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 depuis le 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';