2013-04-16 10 views
6

日付の文字列をDATETIMEの列と比較するクエリで日付の比較を含める必要がありますが、ORACLEとSQL Serverの両方で動作し、2つのクエリ。 oracleとsqlの両方で動作する日付コンパリオンはありますか?SQL ServerとORACLEの日付を比較する一般的なSQL

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上記はOracle上で動作しません。それは無効な月を言っている間違いです。 – CathalMF

+0

@CathalMF [編集者のNLS設定に依存](http://www.sqlfiddle.com/#!4/d41d8/9820)(Ed。 –

+0

@JackDouglas - あなたは正しいです。私はその点を強調した。私は "乱雑"または "危険な"と言って、それを残しておくべきでした。コメントを編集します。 –

答えて

5

この移植性の問題は、リテラルに適用されます。

SQL ServerがANSIリテラルDATEキーワードをサポートせず、すべてのCAST、CONVERT、TO_DATE、および日付関数がすべてのプラットフォームで同一ではないため、これを行うためのポータブルな方法はないと思います。

2番目のクエリはSelect * from MyTable where myDate > '20130410'と書くこともできます。

SQL ServerでANSI DATEリテラル機能(DB/2とTeradataの両方にこれがあります)がサポートされていればいいと思います。

SQL ServerがANSI DATE、TIME、およびTIMESTAMPのリテラルキーワードをサポートしていない理由について、これで接続項目を見つけることができませんでした。

代わりにパラメータを使用することができるかどうか、私はあなたのシナリオで疑問に思いますか?

JackのコメントCommon SQL to compare dates in SQL Server and ORACLEの解は、このコードを移植性のあるものにしますが、移植性のないスカラ関数が必要です。 SQL Serverでは、スカラー関数にそのスキーマを接頭辞する必要があることに注意してください。これは、スキーマを同じ名前にすることができない場合、OracleコードとSQ​​Lコードの間にもう一つのしわを導入する可能性があります(Oracleでは、パッケージ内に関数を置くと、接頭辞はスキーマではなくパッケージの名前になります)

1

独自のユーザー定義関数を定義できますか? DBMS固有のコードを抽象化し、リテラルの 'True'または 'False'の結果を返す関数を作成できます。

[MSSQLユーザー定義関数:] http://msdn.microsoft.com/en-ca/library/ms186755.aspx

[Oracleユーザー定義関数] http://ocs.oracle.com/cd/B19306_01/server.102/b14200

Oracleは明らかに結果がブールタイプなので、文字列(または数値)を返すために、ユーザー定義関数を使用できません。必須。

+1

なぜ文字列を受け取り、日付を返す関数を作成しないのですか? –

+0

彼は行に適用するテストを要求しているので。 – marceljg

+4

'select * from MyTable where myDate> give_me_the_date( '2013-04-10')' –