输出是两列的组合,需要转换为日期。数据源是数字。该代码对于前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
答案 0 :(得分:0)
您可以使用一些数学运算来从OR6
和ORT
中的数值中获取所需的值,然后使用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
。