查询日期时间校正

时间:2013-12-25 05:29:38

标签: sql sql-server date

我有3列varchar(max)数据类型;这些列包含日期(即03/12/2004 - >格式)。

  1. 这些列包含一些无效日期,即30/02/2004 - >二月的月份日期问题

    我使用了这个查询,它将无效日期设为0&有效日期1,但我无法在获得0&之后更正这些日期请给我解决方法如何纠正这些问题。即30/02/200301/03/2003

    SET  DATEFORMAT dmy   
    SELECT Visit_Date, ISDATE(Visit_Date) as ValidDate
    FROM TABLE_NAME 
    
  2. 在3列中更正这些日期后,如何将列数据类型转换为datetime类型? (记住每列中的记录是250万)。

1 个答案:

答案 0 :(得分:0)

如果你确定哪个错误的日期和正确的日期是什么,你可以这样做一个简单的UPDATE

UPDATE TABLE_NAME 
SET Visit_Date = IIF(Visit_Date = '30/02/2003', '01/03/2003', Visit_Date)

如果你没有使用SQL Server 2012,上面的陈述如下:

UPDATE TABLE_NAME 
SET Visit_Date = CASE WHEN Visit_Date = '30/02/2003' THEN '01/03/2003' ELSE Visit_Date END

编辑:

您可以使用以下语句更正日期:

CREATE TABLE DataSource 
(
  [Date] VARCHAR(128) 
)

INSERT INTO DataSource ([Date])
VALUES ('27/02/2003')
      ,('28/02/2003')
      ,('29/02/2003') 
      ,('30/02/2003')
      ,('31/02/2003')
      ,('32/02/2003')
      ,('33/02/2003')
      ,('34/02/2003')
      ,('35/02/2003')
      ,('36/02/2003')

SELECT COALESCE(TRY_CONVERT(DATE,[Date])
               ,DATEADD(DAY
                 ,CAST(SUBSTRING([Date],0,3) AS INT) - 1
                 ,DATEADD(MONTH
                          ,(SUBSTRING([Date],7,4) - 1900) * 12 + SUBSTRING([Date],4,2) - 1 
                          ,0)
                )
       )
FROM DataSource

基本上,它使用日期字符串中的年份和月份创建新日期。例如,如果Date值为29/02/2003,则会创建新日期“2003-02-01”。之后,它使用DATEADD函数将Date值的天数添加到新日期,并让SQL Server自行计算新日期。

以上查询的输出是:

enter image description here

这是一个完整的example