6

I need to include a date comparison in my query where I compare a date string to a DATETIME column but i need it to work on both ORACLE and SQL Server and not have two separate queries. Are there any date comparissons which will work on both oracle and sql?

ORACLE:

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

SQL Server:

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

2 に答える 2

5

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

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

2 番目のクエリは次のようにも記述できることに注意してくださいSelect * from MyTable where myDate > '20130410'

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

これに関する Connect 項目も、SQL Server が ANSI DATE、TIME、および TIMESTAMP リテラル キーワードをサポートしていない理由についても何も見つかりませんでした。

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

Jack のコメントCommon SQL to compare dates in SQL Server and ORACLEのソリューションは、このコードを移植可能にしますが、移植不可能なスカラー関数が必要になります。これは実行可能なオプションかもしれません - SQL Server では、スカラー関数にスキーマのプレフィックスを付ける必要があることに注意してください - これにより、スキーマを同じ名前にできない場合、Oracle コードと SQL コードの間に別の問題が発生する可能性があります(Oracle では、関数をパッケージ内に配置する場合、プレフィックスはスキーマではなくパッケージの名前になる可能性があることに注意してください)

于 2013-04-16T14:52:24.150 に答える
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 では明らかに、ユーザー定義関数がブール型を返すことを許可していないため、文字列 (または数値) の結果が必要です。

于 2013-04-16T15:02:59.487 に答える