如果用户默认语言未知,则对DateTime值进行SQL查询

时间:2017-10-25 10:55:10

标签: sql sql-server

我在数据库中有DateTime类型的列表。 目前,当我需要按此列进行过滤时,我正在使用YYYY-MM-DD HH:MM:SS格式的日期与英语区域设置有效的比较,但如果数据库中用户的默认区域设置是德语,则格式应为YYYY-DD-MM HH:MM:SS我的查询失败了。

我没有找到任何解决方案来将时间戳转换为DateTime而不指定日期格式。

此外,我还试图将DateTime转换为Timestamp(有可能与timestamp值进行比较),但由于某些原因,这不起作用。

示例(MS SQL SERVER):

我在表格中有两列:

ID | CREATEDDATE

1 | 2017-10-23 10:00:00.000

2 | 2017-10-25 10:00:00.000

如果用户默认语言设置为英文查询

SELECT * from TABLE WHERE CREATEDDATE > '2017-10-24 10:00:00'

返回第二行,但是如果默认语言设置为德语,则会出现以下消息错误:

Bei der Konvertierung eines varchar-Datentyps in einen datetime-Datentyp liegt der Wert außerhalb des gültigen Bereichs

我需要一些如何更改我的查询以获得不担心用户默认语言的可能性。

1 个答案:

答案 0 :(得分:2)

无论国际化设置如何,SQL Server都会将以下格式的字符串转换为日期/时间:

  • YYYYMMDD日期
  • YYYY-MM-DDTHH:MM:SS.SSS在秒后允许小数点。

这些格式非常具体,但与国际化无关,如documentation中所述:

  

使用ISO 8601格式的优势在于它是一种   具有明确规范的国际标准。还有,这个   格式不受SET DATEFORMATSET LANGUAGE设置的影响。

请注意,虽然我更喜欢YYYY-MM-DD,但SQL Server确实具有将其解释为YYYY-DD-MM的国际化设置,因此YYYYMMDD更安全。我更喜欢YYYY-MM-DD,因为它(也是)ISO标准,在大多数数据库中使用,更易于阅读,并且混淆的风险相对较小。

在Oracle中,您可以使用DATETIMESTAMP关键字:

  • DATE 'YYYY-MM-DD'日期
  • TIMESTAMP 'YYYY-MM-DD HH:MM:SS'在秒后允许小数点。