我有一些管理不善的varchar字段,其中包含一堆日期(以及一些垃圾数据)。不幸的是,日期已经以月/日/年和日/月/年格式输入这些字段。有几种具体格式,包括d / m / yy,d.mm.yyyy,d / m / yyyy,dd / mm / yy等。
我知道以这种方式存储日期是愚蠢的,但这是第三方的用户定义字段,因此无法确保格式一致。这是示例查询,[SRC User 5]和[SRC User 6]是varchar" date"字段:
WITH cte
AS ( SELECT [SRC Source code] ,
[SRC Description] ,
REPLACE([SRC User 5], '.', '/') AS [SRC User 5] ,
REPLACE([SRC User 6], '.', '/') AS [SRC User 6] ,
[SRC Mailing date] ,
[Date of first order] ,
[CMP Company]
FROM DatabaseName.dbo.Source_LWT
WHERE ISDATE([SRC User 5]) = 1
AND ISDATE([SRC User 6]) = 1
)
SELECT [SRC Source code] ,
[SRC Description] ,
[SRC User 5] AS [Start Date] ,
[SRC User 6] AS [End Date] ,
[SRC Mailing date] AS [In Home Date] ,
[Date of first order] AS [First Order]
FROM cte
WHERE [SRC User 5] <= GETDATE()
AND [SRC User 6] >= GETDATE()
AND YEAR([SRC User 5]) > 13
AND [CMP Company] = 820
ORDER BY [SRC User 6]
现在我收到错误,我想是由日/月/年格式引起的:
导致将varchar数据类型转换为日期时间数据类型 在超出范围的价值。
如果假设大多数值为月/日/年,我如何从该字段中提取最有效的日期?
答案 0 :(得分:0)
谢谢你的询问: 请尝试使用以下内容替换您的查询,希望其工作原理:
WITH cte
AS ( SELECT [SRC Source code] ,
[SRC Description] ,
Cast(REPLACE([SRC User 5], '.', '/') as datetime) AS [SRC User 5] ,
Cast(REPLACE([SRC User 6], '.', '/') as datetime) AS [SRC User 6] ,
[SRC Mailing date] ,
[Date of first order] ,
[CMP Company]
FROM DatabaseName.dbo.Source_LWT
WHERE ISDATE([SRC User 5]) = 1
AND ISDATE([SRC User 6]) = 1
)
SELECT [SRC Source code] ,
[SRC Description] ,
[SRC User 5] AS [Start Date] ,
[SRC User 6] AS [End Date] ,
[SRC Mailing date] AS [In Home Date] ,
[Date of first order] AS [First Order]
FROM cte
WHERE [SRC User 5] <= GETDATE()
AND [SRC User 6] >= GETDATE()
AND right(YEAR([SRC User 5]),2) > 13
AND [CMP Company] = 820
ORDER BY [SRC User 6]
祝你好运