我在数据库中有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
我需要一些如何更改我的查询以获得不担心用户默认语言的可能性。
答案 0 :(得分:2)
无论国际化设置如何,SQL Server都会将以下格式的字符串转换为日期/时间:
YYYYMMDD
日期YYYY-MM-DDTHH:MM:SS.SSS
在秒后允许小数点。这些格式非常具体,但与国际化无关,如documentation中所述:
使用ISO 8601格式的优势在于它是一种 具有明确规范的国际标准。还有,这个 格式不受
SET DATEFORMAT
或SET LANGUAGE
设置的影响。
请注意,虽然我更喜欢YYYY-MM-DD
,但SQL Server确实具有将其解释为YYYY-DD-MM的国际化设置,因此YYYYMMDD更安全。我更喜欢YYYY-MM-DD
,因为它(也是)ISO标准,在大多数数据库中使用,更易于阅读,并且混淆的风险相对较小。
在Oracle中,您可以使用DATE
或TIMESTAMP
关键字:
DATE 'YYYY-MM-DD'
日期TIMESTAMP 'YYYY-MM-DD HH:MM:SS'
在秒后允许小数点。