将不一致的日期字符串转换为datetime,忽略错误的值

时间:2014-12-10 19:52:48

标签: sql-server sql-server-2008-r2

我有一些管理不善的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数据类型转换为日期时间数据类型   在超出范围的价值。

如果假设大多数值为月/日/年,我如何从该字段中提取最有效的日期?

1 个答案:

答案 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]

祝你好运