我有3列varchar(max)
数据类型;这些列包含日期(即03/12/2004
- >格式)。
这些列包含一些无效日期,即30/02/2004
- >二月的月份日期问题
我使用了这个查询,它将无效日期设为0&有效日期1,但我无法在获得0&之后更正这些日期请给我解决方法如何纠正这些问题。即30/02/2003
至01/03/2003
SET DATEFORMAT dmy
SELECT Visit_Date, ISDATE(Visit_Date) as ValidDate
FROM TABLE_NAME
在3列中更正这些日期后,如何将列数据类型转换为datetime
类型? (记住每列中的记录是250万)。
答案 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自行计算新日期。
以上查询的输出是:
这是一个完整的example