2008-11-18 9 views
6

Próbuję przekonwertować działające zapytanie MS Access, aby uruchomić na bazie danych Oracle, które są dostępne za pośrednictwem skryptu VB (.asp). Jest to ostatnia część klauzuli WHERE:Proste pytanie składnia daty SQL Oracle

sql = sql & "WHERE (UAT.HB.MB_MODE = 'A' AND UAT.HB.PRINT_DATE >= '" 
& SD & "' AND UAT.HB.PRINT_DATE <= '" & ED &"' )" 

Zmienna „SD” (czyli „Data rozpoczęcia”) jest ciągiem znaków, które mogą zawierać wartości takie jak „11/11/2008”. To samo dotyczy zmiennej "ED" (tj. "Daty zakończenia").

Jednak daty nie działają. Czy Oracle wymaga specjalnego sposobu używania dat?

Czy daty muszą zostać przeliczone? Czy otaczam je słowem kluczowym "#", tak jak w MS Access?

Odpowiedz

-1

Domyślnym formatem daty dla Oracle jest "dd-mon-yy". Możesz wykonać funkcję TO_CHAR w polu daty, aby przekonwertować ją na format, który chcesz dopasować.

+0

NLS_DATE_FORMAT, który kontroluje domyślny format niejawnego ciągu na datę i datę na ciągi, zależy od ustawień regionalnych klienta. Gdy masz europejski komputer kliencki, zmienia się domyślny format. Ponieważ preferencje klienta zastępują ustawienia bazy danych, kod może się nie powieść. –

+0

Nie należy jednak polegać na wartościach domyślnych. –

+0

absolutnie. Słuszne uwagi. –

15

W Oracle, data powinna być zapisana jako daty ANSI dosłownym tak:

DATE '2008-11-11' 

lub zamienione na randkę z ciągiem jak ten:

TO_DATE('11/11/2008', 'MM/DD/YYYY') 

Zobacz here

+0

Musisz zachować ostrożność, wykonując <= w takim dniu. Będziesz chciał dodać. –

1

zgodnie z this można użyć:

to_date('19960725','YYYYMMDD') 
8

Nie zakładaj, że domyślnym formatem danych Oracle jest cokolwiek. Sprawdź numer NLS_DATE_FORMAT lub użyj TO_DATE, aby go przekonwertować. W ten sposób:

TO_DATE('2008-11-18 14:13:59', 'YYYY-MM-DD HH24:Mi:SS') 

Uwaga "Mi" dla minut, a nie "MM". To przyciąga wielu ludzi.

+0

Zakładam, że chodziło ci o MI za minuty, a nie MM (które byłyby za miesiąc). –

+0

Nie zauważyłem tego, poprawiłem to. Dzięki! – gpojd

0

Oto kilka przykładów konwersji do iz terminach:

  • select to_date('2008/11/18:12:00:00AM', 'yyyy/mm/dd:hh:mi:ssam') from dual
  • select to_char(sysdate, 'mm/dd/yyyy') from dual
0

Domyślny format daty Oracle może się zmienić z jednej bazy do drugiej. Więc jeśli nie znasz formatu daty używanej przez ciebie bazy danych, powinieneś użyć funkcji TO_DATE z jawnym łańcuchem formatu daty. Biorąc pod uwagę fakt, że domyślny format daty może się zmienić w dowolnym momencie, używanie ciągłego formatu daty jest najlepszą rzeczą do zrobienia.

ex: TO_DATE ('11/11/2008 17:30' , 'MM/DD/YYYY HH24: MI')

0

Nie zapomnij, że termin obejmuje czas (domyślnie do 00: 00:00), więc
nie złapany przez coś takiego:
podanych dat, start_date, print_date, end_date trzy, wszystkie na samym dzień
print_date >= start_date AND print_date <= end_date zawodzi bo print_date była większa niż end_date: start_date było 2008-11-19 (00:00:00)
i end_date było 2008-11-19 (00:00:00)
i print_date był 19.11.2008 (16:00:00)