【问题标题】:DateTime coming as '11.22.2022 09.10.00' and sql update query failing日期时间为 \'11.22.2022 09.10.00\' 并且 sql 更新查询失败
【发布时间】:2022-11-22 18:44:19
【问题描述】:

对于一个生产系统,不同的日期/时间格式,我得到的数据时间类似于11.22.2022 09.10.00,当尝试在 sql 查询下运行时,我得到错误The conversion of a varchar data type to a datetime data type resulted in an out-of-range value

我尝试在查询 '{ac.LastCollectionTime:MM/dd/yyyy HH:mm:ss}'),") 之类的 SQL 之前转换日期,但它没有转换。

DECLARE @data TABLE(Id uniqueidentifier, Value DateTime) 
INSERT INTO @data VALUES ('57f5a153-3cce-48d4-aa0d-894c14b1a2ab', '11.22.2022 09.10.00')
UPDATE A SET LastCollectionTime = AD.Value
FROM App A INNER JOIN @data AD on AD.Id = A.Id

如何解决这个问题?

【问题讨论】:

  • 11.22.2022 我觉得很奇怪。我的日历不包含当年的 22 个月
  • 11 是月份,22 是日期:)
  • 那是 SQL Server 可以转换的格式吗?错误消息听起来不一样——你能在查询数据库之前自己转换日期吗?
  • 使用 C# 代码,我尝试转换 '{ac.LastCollectionTime:MM/dd/yyyy HH:mm:ss}'),") ,但日期仍然是这样的
  • 我认为您可能需要将字符串解析为 DateTime 对象。它看起来不像任何默认格式(诚然,需要处理月份和日期的文化交换),但时间“09.10.00”看起来并不熟悉,我希望是“09:10:00”

标签: c# sql sql-server-2016


【解决方案1】:

由于这不是 SQL Server 可以识别的开箱即用的日期字符串格式,您将需要调整数据源以提供适当的格式或手动解析出您需要的位。

这样做的一种方法如下:

create table d(ds varchar(25));
insert into d values
 ('11.22.2022 09.10.00')
,('11.01.2022 01.01.01');


select d.ds
      ,datetime2fromparts(dp.y,dp.mo,dp.d,dp.h,dp.mi,dp.s,0,0) as dt
from d
  cross apply(values(substring(d.ds,7,4)
                    ,substring(d.ds,1,2)
                    ,substring(d.ds,4,2)
                    ,substring(d.ds,12,2)
                    ,substring(d.ds,15,2)
                    ,substring(d.ds,18,2)
                    )
             ) as dp(y,mo,d,h,mi,s)

哪些输出:

ds dt
11.22.2022 09.10.00 2022-11-22 09:10:00
11.01.2022 01.01.01 2022-11-01 01:01:01

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多