在SQL Server和ORACLE中比较日期的常见SQL

6

我需要在查询中包含一个日期比较,其中我将一个日期字符串与DATETIME列进行比较,但我需要它在ORACLE和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)

@Aaron Bertrand,不,上述方法在Oracle中不起作用。它会报错并提示月份无效。 - CathalMF
@CathalMF 这取决于您的NLS设置,正如Ed所提到的那样(http://www.sqlfiddle.com/#!4/d41d8/9820)。 - user533832
3
你听说过dba.se吗?我相信你会在那里找到一些感兴趣的问题,我们对“DBA”有一个相当广泛的定义(参见常见问题解答),而且我可以告诉你,你对Oracle很了解。 - user533832
1
感谢Aaron给出的删除/重新发布建议;我应该早想到了!在Oracle中,任何字符串日期都使用NLS_DATE_FORMAT设置进行解析,通常为'DD-MON-RR'(2位数字日号,月份名称缩写,带有世纪转折的2位数字年份),因此WHERE myDate > '20130410'将引发“ORA-01861:字面量与格式字符串不匹配”的错误。如果你做ALTER SESSION SET NLS_DATE_FORMAT = 'YYYYMMDD',你可以摆脱它,但这可能会很麻烦。 - Ed Gibbs
2
@EdGibbs dba.SE 不仅涉及传统的 DBA 任务,如备份、配置等,还包括高级查询、语法和性能调优。 - Aaron Bertrand
显示剩余4条评论
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 to compare dates in SQL Server and ORACLE 将使此代码具有可移植性,但您必须拥有一个非可移植的标量函数。 这对您可能是一个可行的选择 - 请注意,在 SQL Server 中,您需要在标量函数前加上其模式 - 如果您无法使架构名称相同,则这可能会在 Oracle 代码和 SQL 代码之间引入另一个麻烦(请注意,在 Oracle 中,前缀可以是包的名称,而不是模式,如果您将函数放在包内)


1

1
为什么不创建一个函数,它接受一个字符串并返回一个日期呢? - user533832
因为他正在要求对一行应用测试。 - marceljg
4
MyTable中选择所有满足条件myDate > give_me_the_date('2013-04-10')的数据。其中,give_me_the_date('2013-04-10')表示一个返回日期值为2013年4月10日的函数或过程。 - user533832

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接