从字符串转换失败的日期和/或时间

时间:2019-03-27 10:13:12

标签: sql sql-server tsql

输出是两列的组合,需要转换为日期。数据源是数字。该代码对于前100,000个有效,并且在409,560之后发生错误。错误为“从字符串转换日期和/或时间时转换失败。”

SELECT

CASE WHEN LEN(OR6) = 6 THEN 
        CAST(CONCAT(SUBSTRING(CONVERT(VARCHAR(10),ORT),1,4),SUBSTRING(CONVERT(varchar(10),OR6),3,2),SUBSTRING(CONVERT(varchar(10),OR6),1,2))AS DATE) 
    WHEN LEN(OR6) = 5 THEN 
        CAST(CONCAT(SUBSTRING(CONVERT(VARCHAR(10),ORT),1,4),SUBSTRING(CONVERT(varchar(10),OR6),2,2),'0',SUBSTRING(CONVERT(varchar(10),OR6),1,1))AS DATE) 
    ELSE NULL 
END AS ORI_MAT_DT ,DATE1 = OR6 ,DATE2 = ORT
FROM DATETABLE

这是原始的源数据库:

ROW       OR6      ORT
409,559  10611  2011152
409,560  50618  2018156
409,561  10615  2015152
409,562  50618  2018156

预期结果:

ORI_MAT_DT  DATE1   DATE2 
2001-08-15  150801  2001227

1 个答案:

答案 0 :(得分:0)

您可以使用一些数学运算来从OR6ORT中的数值中获取所需的值,然后使用DateFromParts构造日期:

源数据:

DECLARE @Date1 numeric(10,2) = 150801,
        @Date2 numeric(10,2) = 2001227

查询:

SELECT DATEFROMPARTS(
        @Date2 / 1000, -- Get the year
       (@Date1 % 10000 - @Date1 % 100) / 100, -- Get the month
        @Date1 / 10000 -- Get the day
       ) As Date

结果:

Date
2001-08-15

DateFromParts函数采用表示年,月和日的int值并构造一个Date对象。由于它花费int,因此SQL Server将通过截断小数部分将您从计算中获得的数值隐式转换为int