Oracle SQL和SQL Server中的统一SQL日期

3

正如标题所示,我正在尝试创建一个统一的查询语句,该语句具有适用于Oracle SQL和SQL Server的兼容语法。

我目前使用的语法是基于Oracle编写的:

SELECT * 
FROM TableA
WHERE CREATION_DATE = TO_DATE('12-09-2015', 'DD-MM-YYYY') 

当我在SQL Server中尝试构建时,这并不起作用。SQL Server的语法是:
SELECT * 
FROM TableA 
WHERE OrderDate='12-09-2015'

但是在Oracle SQL中这不起作用...

那么有没有一种统一的方法来编写它呢?


2
你是否有使用常量的原因?而不是使用绑定变量,这样你就可以在构建应用程序的任何语言中使用存在的日期类? - Justin Cave
+1 给 Justin Cave 的建议。使用带有日期类型参数的参数化查询更安全,不仅可以避免本地化问题,还可以提高安全性和性能。顺便说一句,在 SQL Server 中,不变的日期格式是 YYYYMMDD - Panagiotis Kanavos
绑定变量在可用时最好使用,但并非始终如此。有时需要硬编码日期来编码业务规则,例如税率在某个日期更改,某些ID或参考号码的计算方式根据日期进行更改。 - Ben
2个回答

2

我不确定SQL Server是否支持ANSI DATE 字面量,但在Oracle中支持。默认的字符串字面量格式为YYYY-MM-DD

DATE '2015-09-12'

如果SQL Server也支持ANSI标准,那么请使用它。这很简单。

根据这个链接,我认为你可以在两个数据库中都使用上述方法。

WHERE OrderDate='12-09-2015'

永远不要这样做。你正在将日期字符串进行比较,根据你的本地特定NLS设置,你可能会得到正确的数据,但是永远不要依赖隐式数据类型转换


不确定即使对于Oracle来说这是否正确。SQL Server理解完整的日期时间ISO格式,即包括时间元素。根据Wikipedia的说法,哈萨克斯坦仍然使用YDM格式。两个数据库都可能遇到旧客户端的问题。 - Panagiotis Kanavos
@Guil 这是因为你需要使用完整的ISO格式,包括时间元素。否则,您可以使用未分隔的日期格式,即YYYYMMDD。不知道Oracle是否支持此功能。 - Panagiotis Kanavos
Oracle 绝对支持它。关键是格式模型,就是这样。如果没有时间元素,那么只需使用纯 ANSI 日期字面值 DATE 'YYYY-MM-DD'。 对于日期时间,Oracle 有 TO_DATE 函数,可以根据格式模型和值使用。例如,TO_DATE('2015-09-12 13:05','YYYY-MM-DD HH24:MI')。由于 OP 只关心日期部分而不是时间部分,我建议使用 ANSI 日期字面值。 - Lalit Kumar B
@LalitKumarB 的重点是使用一个明确无误的格式,即一个不受语言影响的格式。SQL Server也支持YYYY-MM-DD,但它受到语言的影响。如果Oracle也受到影响,那么YYYY-MM-DD就不适合了。 - Panagiotis Kanavos
@LalitKumarB 你误解了。SQL Server也没有“格式”。我们在这里谈论的是字符串文字。在SQL Server中,仅包含日期的文本2015-09-08会受到语言格式的影响。唯一保证不受影响的日期格式*是YYYYMMDD。如果您想使用ISO格式,则需要指定时间元素以及 带T,即 2015-09-08T15:00:00 - Panagiotis Kanavos
显示剩余3条评论

0

使用此代码可在两者上运行:

CAST('2015-09-14' as date)

类型转换只执行一次,因此不会影响性能。


@Guil:那你很幸运。如果你没有使用某些区域设置,其中“2015-09-14”是被接受的日期表示形式,它在Oracle中不起作用。在我的机器上设置为德语时,它绝对不起作用。(我得到ORA-01861错误。) - Thorsten Kettner
@ThorstenKettner,这似乎不符合SQL92的要求,该要求接受与日期文本相同格式的字符字符串。奇怪。 - Ben
只有在Oracle中设置了NLS_DATE_FORMAT为“yyyy-mm-dd”才能正常工作,这一点不应该被假定。 - Johnathan Barclay

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