2012-05-28 14 views
10

Mam pole typu DB2 DATE w tabeli DB2. Chcę wybrać dane według filtru daty. Na przykład:Porównywanie dat DB2

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

z powyższej kwerendy, mam rekordy ze registrationdate począwszy od „1943-10-01”, ale jest to błędne.

Te nie działa albo:

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

Jak muszę porównać daty?

+1

Jak jest "registrationdate" kolumny zdefiniowane? Być może typ danych kolumny nie jest datą, jeśli tak było, wtedy twoje pierwotne zapytanie powinno zadziałać. – NealB

Odpowiedz

3

badałem niektóre inne problemy z bazą danych, po restarcie zaczęło do pracy, więc teraz działa to poprawnie:

registrationdate > '2002-10-01' 
13

Standardowy format SQL na randkę dosłownego jest:

DATE '2002-10-01' 

Przynajmniej, to warto spróbować:

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

jeśli parametr registrationdate jest zdefiniowany jako znacznik czasu, wystarczy powiedzieć timestamp'2012-12-21 ' – fedvasu

0

Użyj tego formatu.

registrationdate > 'mm/dd/yyyy' 
+0

Zakładając, że 'registrationDate' jest parametrem daty, zmiana formatu nie przyniesie efektu. Jeśli jest to coś w rodzaju znaku, to ** nie zadziała W CAŁOŚCI ** - wybrany przez ciebie format nie ładnie się sortuje. ISO to standardowy zalecany format z jakiegoś powodu. –

3

Domyślny format używany do terminów zależy od kodu terytorium DB2 bazy danych (który może być określony w momencie tworzenia bazy danych). Na przykład moja baza danych została utworzona przy użyciu obszaru = US. Dlatego format daty wygląda następująco:

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

1 record(s) selected. 

Możesz otrzymać kod terytorium od 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 

Oznacza to, że format jest MM/DD/YYYY. Jeśli chcesz zmienić format, możesz powiązać kolekcję pakietów narzędziowych db2, aby użyć innego formatu daty.

Aby uzyskać aktualną datę, czas i datownik za pomocą SQL (w zasadzie daje wyobrażenie o tym, co jest format daty) odwołać się do odpowiednich rejestrów DB2: sysibm.sysdummy1 stół jest specjalny in-memory stół, który może być używany do odkrywania wartości DB2 rejestruje

db2 "SELECT current date FROM sysibm.sysdummy1 " 

1 
---------- 
06/02/2014 

    1 record(s) selected. 

funkcja DATA nadal działa, nawet jeśli pominąć cytaty w funkcji, ale wynik nie jest prawidłowy:

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

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

    1 record(s) selected. 

Gdy funkcja DATE pobiera ciąg znaków jako dane wejściowe, zakłada, że ​​jest poprawną reprezentacją znaku daty DB2 i odpowiednio ją konwertuje. Natomiast gdy dane wejściowe są numeryczne, funkcja przyjmuje, że reprezentuje liczbę dni minus jeden od początku bieżącej ery (czyli 0001-01-01). W powyższym zapytaniu wprowadzono 2001-09-22, co odpowiada (2001-9) -22, co równa się 1970 dni.

Jeśli powyższe warunki mają zastosowanie, poniższe polecenie powinno działać prawidłowo w przypadku problemu.

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