6

我需要在我的查询中包含一个日期比较,我将日期字符串与DATETIME列进行比较,但我需要它同时在 ORACLE 和 SQL Server 上工作,并且没有两个单独的查询。是否有适用于 oracle 和 sql 的日期比较?

甲骨文:

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

SQL 服务器:

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

2 回答 2

5

此可移植性问题仅适用于文字。

我不相信有一种完全可移植的方法来做到这一点,因为 SQL Server 不支持 ANSI 文字 DATE 关键字,并且所有 CAST、CONVERT、TO_DATE 和日期函数在所有平台上都不相同。

请注意,您的第二个查询也可以写为Select * from MyTable where myDate > '20130410'.

如果 SQL Server 支持 ANSI DATE 文字功能(DB/2 和 Teradata 都具有此功能),那就太好了。

我找不到关于此的 Connect 项,也找不到任何关于 SQL Server 不支持 ANSI DATE、TIME 和 TIMESTAMP 文字关键字的原因。

我想知道在您的情况下,是否可以改用参数?

Jack 评论Common SQL 中用于比较 SQL Server 和 ORACLE 中的日期的解决方案将使此代码可移植,但您必须具有不可移植的标量函数。这对您来说可能是一个可行的选择 - 请注意,在 SQL Server 中,您需要在标量函数前面加上其架构 - 如果您不能使架构同名,这可能会在 Oracle 代码和 SQL 代码之间引入另一个问题(注意在 Oracle 中,如果将函数放在包中,前缀可能是包的名称而不是模式)

于 2013-04-16T14:52:24.150 回答
1

是否允许定义您自己的用户定义函数?您可以创建一个函数来抽象 DBMS 特定代码并返回文字“真”或“假”结果。

[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 回答