SQL Server 将字符串转换为日期时间

Posted

技术标签:

【中文标题】SQL Server 将字符串转换为日期时间【英文标题】:SQL Server converting string to datetime 【发布时间】:2021-06-26 07:49:38 【问题描述】:

我正在使用 SQL 服务器,我需要将一段字符串转换为日期时间,但我收到了错误

将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。

到目前为止,这是我的代码导致问题

SELECT TOP (1) [stream]
    , convert(datetime, SUBSTRING(Stream, 12, 10), 103) as Date
FROM x
where .....

select *
from

当我将日期时间更改为 varchar 时,日期显示为“03/28/2021”

但是我需要它以“28/03/2021”的形式出现,我相信它才能正常工作

基本上只是切换我认为的月份和日期?

有什么想法吗?

【问题讨论】:

传入流中日期的确切格式是什么? Set dateformat 大家好,数据以 03/28/2021 流入。所以这就是为什么我将其显示为 varchar 作为默认值,我需要将其更改为 28/03/2021 @d_chawke Stream 包含什么?如果解析失败,那是因为日期 string 与样式不匹配。日期本身没有格式,它们是二进制值。如果CONVERT 成功,结果将没有格式。由客户端以一种或另一种方式显示 datetime 首先不要使用varchars 作为日期和时间值。有 6 种日期和时间数据类型可供选择,它们要好得多。日期和时间数据类型也没有格式,由演示文稿选择它们出现的格式,不是 RDBMS。 【参考方案1】:

这里没有足够的信息来给你一个准确的答案——我们不知道你到底输入了什么输入数据。

转换为 DateTime 的文档:

https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-ver15

具有各种日期时间格式 dd/mm/yyy 、 mm/dd/yyyy 等的语言环境代码(您传递 103)

找到适用于您正在尝试做的事情的那个。

您关于“超出范围值”的错误意味着您使用了错误的区域设置格式 - 超过 12 的 DAY 值(例如 28 日)被解释为 MONTH 值。由于日历中没有第 28 个月,因此会引发错误。

您传入的语言环境代码为 103 = 这是英式英语:dd/mm/yyyy 尝试用 mm/dd/yyyy 的 101 (en-US) 替换它

【讨论】:

嗨@JimP76,是的,我必须使用 103 本地代码。但是它没有为我转换它,数据以“03/28/2021”的形式出现。但我需要交换日期和月份。我想通过输入日期时间和 103 代码它会为我做,但它似乎没有,因此错误 03/28/20212 对 103 不友好。您需要将其更改为 101。103 告诉 SQL 将其解释为第 28 个月的第 3 天,采用英式英语 dd/mm/yyyy 格式 @d_chawke 冗长,这个答案是说使用 101 NOT 103 :) 你试图将它转换为日期,所以将样式设置为格式它在现在,然后你有一个没有格式的本地日期。 太棒了!谢谢你们俩,效果很好,对不起,我是这方面的新手,但这对我来说是很好的学习。再次感谢!【参考方案2】:

您需要告诉 SQL Server 传入的日期格式是什么。

发出set dateformat mdy,然后执行您的查询。

【讨论】:

感谢您的反对。日期格式通常是导致日期时间错误的原因。很抱歉这个答案给您带来了问题。 这不是 OP,当问题专门使用 convert + style 时,默认日期格式无关紧要,因为格式已指定。因此,这并不能回答问题。【参考方案3】:

您可以使用try_convert 进行调试。它将显示 null 而不是错误:

SELECT TOP (1) [stream]
    , convert(datetime, SUBSTRING(Stream, 12, 10), 103) as Date
FROM x
where try_convert(datetime, SUBSTRING(Stream, 12, 10), 103)
  is null

【讨论】:

以上是关于SQL Server 将字符串转换为日期时间的主要内容,如果未能解决你的问题,请参考以下文章

sql server2000如何将数字转换为日期时间

如何将包含时区的字符串转换为日期时间 sql server

SQL Server 查询(查看)将字符串转换为日期时间

SQL Server 无法使用有效字符串将字符串转换为日期时间

如何在 SQL Server 中将字符串转换为日期时间?

如何将 SQL Server 的时间戳列转换为日期时间格式