2013-04-16 10 views
6

Muszę uwzględnić w moim zapytaniu porównanie dat, w którym porównałem ciąg daty z kolumną DATETIME, ale potrzebuję go do pracy na obu ORACLE i SQL Server i nie mam dwóch oddzielnych zapytania. Czy są jakieś kompilacje z datami, które będą działać zarówno na Oracle, jak i SQL?Często używany SQL do porównywania dat w SQL Server i ORACLE

ORACLE:

Select * from MyTable where myDate > DATE '2013-04-10' 

SQL Server:

Select * from MyTable where myDate > convert(DATETIME,'2013-04-10', 126) 
+0

@Aaron Bertrand Nie powyższe nie działa w wyroczni. Występują błędy, mówiąc, że jest to nieprawidłowy miesiąc. – CathalMF

+0

@CathalMF [zależnie od ustawień NLS] (http://www.sqlfiddle.com/#!4/d41d8/9820), o czym wspomniał Ed. –

+0

@JackDouglas - masz rację; Przesadziłem w tym punkcie. Powinienem powiedzieć "niechlujny" lub "ryzykowny" i zostawić to. Będę edytować komentarz. –

Odpowiedz

5

Ten problem dotyczy tylko przenośności z literałów.

Nie sądzę, że istnieje w pełni przenośny sposób, aby to zrobić, ponieważ SQL Server nie obsługuje słowa kluczowego DATE ANSI, a wszystkie funkcje CAST, CONVERT, TO_DATE i daty nie są identyczne na wszystkich platformach.

Pamiętaj, że Twoje drugie zapytanie można również zapisać jako Select * from MyTable where myDate > '20130410'.

Byłoby miło, gdyby było wsparcie w SQL Server dla funkcji literowej ANSI DATA (DB/2 i Teradata oba mają to).

Nie mogłem znaleźć elementu Connect w tej sprawie, ani nic w tym, dlaczego SQL Server nie obsługuje literalnych słów kluczowych ANSI DATA, CZAS i TIMESTAMP.

Zastanawiam się w twoim scenariuszu, czy można zamiast tego użyć parametru?

Rozwiązanie w komentarzu Jacka Common SQL to compare dates in SQL Server and ORACLE spowoduje, że ten kod będzie przenośny, ale będziesz musiał mieć nieprzenośną funkcję skalarną. To może być opłacalna opcja - zwróć uwagę, że w SQL Serverze musisz poprzedzić funkcję skalarną swoim schematem - może to wprowadzić kolejną zmarszczkę między kodem Oracle i kodem SQL, jeśli nie możesz uczynić schematów taką samą nazwą (uwaga w Oracle, przedrostek może być nazwą pakietu zamiast schematu, jeśli umieścisz funkcję wewnątrz paczki)

1

Czy można zdefiniować własne funkcje zdefiniowane przez użytkownika? Można utworzyć funkcję, która streści specyficzny kod DBMS i zwróci dosłowny wynik "Prawda" lub "Fałsz".

[MSSQL zdefiniowane przez użytkownika funkcje:] http://msdn.microsoft.com/en-ca/library/ms186755.aspx

[Oracle Funkcje zdefiniowane przez użytkownika] http://ocs.oracle.com/cd/B19306_01/server.102/b14200

Oracle najwyraźniej nie pozwala zdefiniowanych przez użytkownika funkcji, aby powrócić do typu Boolean, więc ciąg (lub numerycznych) wynik jest wymagany.

+1

dlaczego nie po prostu utworzyć funkcję, która pobiera ciąg znaków i zwraca datę? –

+0

Ponieważ on prosi o test do zastosowania do rzędu. – marceljg

+4

'wybierz * z MyTable gdzie myDate> give_me_the_date (" 2013-04-10 ")' –