将 varchar 值转换为 SQL 服务器中的日期
Convert varchar value to date in SQL Server
我正在将 varchar 数据转换为 SQL 服务器中的日期。
Table 有如下数据,
所以它可以有 NULL 值、正确格式化的日期并且可以有 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, Level 16, State 1, Line 3 Conversion failed when converting
date and/or time from character string.
我想以日期格式输出 MM-dd-yyyy
请帮帮我!谢谢!
您可以使用此查询来解决您的问题。它只是将您的 varchar 列转换为格式化的 MM-dd-yyyy
select convert(varchar(10), cast('2011-09-28' as date), 101)
CREATE TABLE #A
( COL VARCHAR(10)
)
INSERT INTO #A VALUES( NULL),('19900411'),('19900411'),('04-04-1976'),('10-30-1952'),('19950422')
SELECT DATESTRINGFIELD = CONVERT(VARCHAR, CONVERT(DATE, COL) , 101) FROM #A
output
04/11/1990
04/11/1990
04/04/1976
10/30/1952
04/22/1995
我想,你需要这个:
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 演示:SQL DEMO
你能检查这个答案吗?这适用于 Sql Server 2012 及更高版本。
根据我们的讨论,我创建了一个样本数据。
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
我正在将 varchar 数据转换为 SQL 服务器中的日期。
Table 有如下数据,
所以它可以有 NULL 值、正确格式化的日期并且可以有 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, Level 16, State 1, Line 3 Conversion failed when converting date and/or time from character string.
我想以日期格式输出 MM-dd-yyyy
请帮帮我!谢谢!
您可以使用此查询来解决您的问题。它只是将您的 varchar 列转换为格式化的 MM-dd-yyyy
select convert(varchar(10), cast('2011-09-28' as date), 101)
CREATE TABLE #A
( COL VARCHAR(10)
)
INSERT INTO #A VALUES( NULL),('19900411'),('19900411'),('04-04-1976'),('10-30-1952'),('19950422')
SELECT DATESTRINGFIELD = CONVERT(VARCHAR, CONVERT(DATE, COL) , 101) FROM #A
output
04/11/1990
04/11/1990
04/04/1976
10/30/1952
04/22/1995
我想,你需要这个:
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 演示:SQL DEMO
你能检查这个答案吗?这适用于 Sql Server 2012 及更高版本。
根据我们的讨论,我创建了一个样本数据。
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