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_chawkeStream
包含什么?如果解析失败,那是因为日期 string 与样式不匹配。日期本身没有格式,它们是二进制值。如果CONVERT
成功,结果将没有格式。由客户端以一种或另一种方式显示 datetime
值
首先不要使用varchar
s 作为日期和时间值。有 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 将字符串转换为日期时间的主要内容,如果未能解决你的问题,请参考以下文章