【问题标题】:Common SQL to compare dates in SQL Server and ORACLE在 SQL Server 和 ORACLE 中比较日期的常用 SQL
【发布时间】:2013-04-09 00:56:45
【问题描述】:

我需要在我的查询中包含一个日期比较,我将一个日期字符串与一个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)

【问题讨论】:

  • @Aaron Bertrand 不,以上在 oracle 中不起作用。它错误地说它是一个无效的月份。
  • @CathalMF 即 Ed 提到的 depends on your NLS settings
  • @EdGibbs 你听说过dba.se吗?我很确定你会在那里找到你喜欢的奇怪问题,我们有一个漂亮的broad definition of 'DBA',我可以告诉你很多关于 Oracle 的知识。
  • 感谢 Aaron 的删除/重新发布建议;应该想到的!这里是:在 Oracle 中,任何字符串日期都使用 NLS_DATE_FORMAT 设置进行解析,该设置通常是 'DD-MON-RR'(2 位数的日期 #,月份名称缩写,2 位数的年份,带有世纪汇总),所以 WHERE myDate > '20130410' 将抛出 ORA-01861: literal does not match format string。如果你执行 `ALTER SESSION SET NLS_DATE_FORMAT = 'YYYYMMDD',你可以侥幸逃脱,但这可能会变得混乱。
  • @EdGibbs dba.SE 与备份、配置等传统 DBA 任务一样,涉及高级查询、语法和性能调整。

标签: sql sql-server oracle


【解决方案1】:

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

我不相信有一种完全可移植的方法来做到这一点,因为 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 中,如果将函数放在包中,前缀可能是包的名称而不是模式)

【讨论】:

    【解决方案2】:

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

    [MSSQL 用户定义函数:]http://msdn.microsoft.com/en-ca/library/ms186755.aspx

    [Oracle用户定义函数]http://ocs.oracle.com/cd/B19306_01/server.102/b14200

    Oracle 显然不允许用户定义的函数返回布尔类型,因此需要字符串(或数字)结果。

    【讨论】:

    • 为什么不直接创建一个接受字符串并返回日期的函数?
    • 因为他要求对一行进行测试。
    • select * from MyTable where myDate > give_me_the_date('2013-04-10')
    猜你喜欢
    • 2012-04-28
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多