Sql server 在SQL Server中将varchar值转换为日期
我正在SQL server中将varchar数据转换为日期 具有如下数据的表 因此,它可以有空值、正确格式的日期,并且可以有类似于Sql server 在SQL Server中将varchar值转换为日期,sql-server,sql-server-2012,sql-server-2008-r2,varchar,date-conversion,Sql Server,Sql Server 2012,Sql Server 2008 R2,Varchar,Date Conversion,我正在SQL server中将varchar数据转换为日期 具有如下数据的表 因此,它可以有空值、正确格式的日期,并且可以有类似于19900411和04221995的内容 所以我尝试了下面的方法,但出现了错误 SELECT CASE WHEN ISNULL(CAST(Dob AS VARCHAR), '') = '' THEN NULL WHEN LEN(CAST(Dob AS VARCHAR)) = '8' THEN CONVERT(
19900411
和04221995
的内容
所以我尝试了下面的方法,但出现了错误
SELECT CASE
WHEN ISNULL(CAST(Dob AS VARCHAR), '') = '' THEN NULL
WHEN LEN(CAST(Dob AS VARCHAR)) = '8' THEN CONVERT(
VARCHAR(10),
CONVERT(date, RIGHT(Dob, 4) + LEFT(Dob, 2) + SUBSTRING(Dob, 3, 2)),
103
)
ELSE CONVERT(VARCHAR, CAST(Dob AS CHAR(8)), 103)
END
FROM TableName
WHERE Dob IS NOT NULL
转换时,Msg 241,16级,状态1,第3行转换失败
来自字符串的日期和/或时间
我想以日期格式获得输出MM dd yyyy
请帮帮我!谢谢 您可以使用此查询解决您的问题。它只需将varchar列转换为格式化的MM dd yyyy
select convert(varchar(10), cast('2011-09-28' as date), 101)
我想,你需要这个:
SELECT CASE
WHEN ISNULL(CAST(Dob AS VARCHAR), '') = '' THEN NULL
WHEN LEN(CAST(Dob AS VARCHAR)) = '8' THEN CONVERT(VARCHAR(10),
CONVERT(date, RIGHT(Dob, 2) + '-' + SUBSTRING(Dob, 5, 2) +'-' + LEFT(Dob, 4)),
103)
ELSE CONVERT(VARCHAR, CAST(Dob AS CHAR(10)), 103)
END
FROM tbl
WHERE Dob IS NOT NULL
输出:04/11/1990
SQL Fiddle演示:您能检查一下这个答案吗。这是SQLServer2012及更高版本的工作 根据您的讨论,我创建了一个示例数据
CREATE TABLE #A
( COL VARCHAR(10)
)
INSERT INTO #A VALUES( NULL),('19900411'),('19900411'),('04-04-1976'),('10-30-1952')
insert into #A values ('04221995')
insert into #A values ('02222009 ')
select * from #a
SELECT
case isdate(col ) when 1 then CONVERT(VARCHAR, CONVERT(DATE, COL) , 105)
when 0 then SUBSTRING(COL,1,2) + '-'+SUBSTRING(COL,3,2) + '-'+SUBSTRING(COL,5,4)
end
FROM #A
分两步完成-首先统一字符串格式,然后转换为日期。如果您可以更改表格以在日期列中保存日期,这将是最好的。实际上,数据将以平面文件格式导入此表格,因此我无法更改它。在一步中不可能?您能识别表中的所有日期格式吗?不能识别所有日期,但我必须处理像
0422195
这样的日期,是12301123
1123年12月30日还是1230年11月23日?准确识别每种格式非常重要,否则,您会在最佳情况下出现错误,或者在最坏情况下出现错误日期。从字符串转换日期和/或时间时,获取错误Msg 241,16级,状态1,第1行转换失败。
您可以通过强制转换DobI来优化此操作,但仍然得到同样的错误<代码>强制转换(Dob为字符(8)显示演示时出错-哎呀!出现问题。请重试,如果继续出现这种情况,请发送电子邮件admin@sqlfiddle.com关于它。不正确的语法。我已经更改了它,但没有成功。@pedram我已经更新了我的答案。请使用这个。其他人已经编辑了我的答案。谢谢。但是对于像0222209
谢谢你的回答!这个数据怎么样?表中也有类似的数据。所以你能提供更好的答案吗?不起作用。请为类似于04221995的数据提供一些解决方案。我插入了那个日期,也请检查上面的答案
CREATE TABLE #A
( COL VARCHAR(10)
)
INSERT INTO #A VALUES( NULL),('19900411'),('19900411'),('04-04-1976'),('10-30-1952')
insert into #A values ('04221995')
insert into #A values ('02222009 ')
select * from #a
SELECT
case isdate(col ) when 1 then CONVERT(VARCHAR, CONVERT(DATE, COL) , 105)
when 0 then SUBSTRING(COL,1,2) + '-'+SUBSTRING(COL,3,2) + '-'+SUBSTRING(COL,5,4)
end
FROM #A