无法将特定的日期时间字符串转换为日期
Posted
技术标签:
【中文标题】无法将特定的日期时间字符串转换为日期【英文标题】:Cannot cast a specific datetime string into a date 【发布时间】:2021-12-21 17:04:44 【问题描述】:为什么我可以把它作为一个日期:
select cast('3/11/2021 12:00:00 AM' as date)
但不是这个:
select cast('26/02/2021 12:00:00 AM' as date)
感谢您的帮助
【问题讨论】:
使用convert
,因为它允许您指定传入格式。
docs.microsoft.com/en-us/sql/t-sql/functions/…
谢谢,这似乎工作 select convert(date, '26/02/2021 12:00:00 AM', 105)
例如select convert(datetime, '3/11/2021 12:00:00 AM',103)
好吧,3/11/2021
给了你什么? 3月11日还是11月3日?我不知道您的期望这一事实应该暗示了为什么这种格式会出现问题。
【参考方案1】:
Cast 使用基于 SQL Server 区域设置的“默认”格式 (#101),而 CONVERT - 正如 Dale K 建议的那样,允许您指定使用的日期格式。
在您的示例中,我认为:3/11 是 3 月 11 日,26/02 是 26 个月的第二天,这根本行不通。
使用转换的示例:
select convert(datetime,'26/02/2021',103)
select convert(datetime,'02/26/2021',101)
【讨论】:
这就是为什么yyyy-mm-dd
是个好主意。摆脱所有 mm/dd
与 dd/mm
的混淆。
@Robill 其实YYYY-MM-DD
也不是一个好主意。 SET LANGUAGE French; SELECT CONVERT(datetime, '2021-09-14');
见dbfiddle.uk/…
@AaronBertrand,在这种情况下,这个坏主意可能是datetime
本身,因为您的样本可以与date
或datetime2
一起使用。无论如何,如果涉及文化/语言特定格式,我们不应该在没有第三个参数的情况下使用CONVERT
。来自文档:“将 time、date、datetime2 和 datetimeoffset 数据类型用于新工作。这些类型符合 SQL 标准。它们更便携。”
@Shnugo 所以只有当你知道日期/时间类型是在这个特定的集合中时才使用特定的格式?这听起来不像是坏主意的定义吗?我很想确保每个使用我的代码的人都可以享受只使用特定类型的奢侈,但这不是世界的运作方式。此外,不安全格式的使用不仅在与显式 CONVERT() 一起使用时不好,而且在一般情况下也是如此。
@Shnugo 哈哈,对。对于所有来到 Stack Overflow 并从答案中复制代码然后也去研究文档并遵循其所有建议的人。我更喜欢 'YYYYMMDD'
作为文字,因为 - 尽管它的可读性有点低 - 它不需要任何类型的强制,并且不容易受到用户(或计算机,基于语言、区域或日期格式设置)的误解)。我写了很多关于日期格式的文章,例如here,更一般地说,here。以上是关于无法将特定的日期时间字符串转换为日期的主要内容,如果未能解决你的问题,请参考以下文章
无法将字符串转换为日期和日期转换为字符串 Swift 5.2
iOS Swift:当字符串包含时区缩写时,如何将特定的日期字符串格式转换为日期对象?