在MyTable
中,Values
数据类型为NVARCHAR
的列。这里放置了许多值,如:
Alisa
20150111
Something 12
Etc 2222
4444
01/21/2015 11:01:12 AM
etc
我需要从此列中选择所有值,但格式如mm/dd/yyyy hh:mm:ss AM/PM
我需要将其转换为DATE(没有时间)mm/dd/yyyy
我尝试使用ISDATE
,但它无法正常工作,它也将其他值转换为日期,例如从我的示例列表4444
到日期格式。
这是我现在的查询:
SELECT CASE WHEN ISDATE(Values) = 1 THEN CONVERT(VARCHAR(20), Values, 101)
ELSE Values
END AS Val1
FROM MyTable
所以列表应该在以下内容中返回:
Alisa
20150111
Something 12
Etc 2222
4444
01/21/2015 -- this line should be changed
etc
答案 0 :(得分:2)
尝试
SELECT CASE WHEN Values LIKE '__/__/____%' THEN CONVERT(VARCHAR(20), Values, 101)
ELSE Values
END AS Val1
FROM MyTable
答案 1 :(得分:1)
此脚本将验证正确格式的日期,如果是日期则取前10个字符,否则,它将选择值的原始值。注释值是保留字。在其他情况下,您可以使用sqlserver 2012中的try_convert。
DECLARE @t table([Values] varchar(50))
INSERT @t values ('01/20/2015 01:01:01 AM')
INSERT @t values ('02/28/2014 01:01:01 PM')
INSERT @t values ('02/35/2014 01:01:01 PM')
INSERT @t values ('4444')
SELECT
CASE WHEN [Values] like
'[01][0-9]/[0-3][0-9]/[1-2][0189][0-9][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9] [AP]M'
and isdate([Values]) = 1
THEN
left( [Values], 10) -- format of date was already verified
ELSE [Values]
END AS Val1
FROM @t MyTable
结果:
Val1
01/20/2015
02/28/2014
02/35/2014 01:01:01 PM
4444
答案 2 :(得分:0)
也许尝试检查字符串是否包含/
,如下所示:
SELECT CASE WHEN ISDATE(Values) = 1 and CHARINDEX('/',Values) > 0
THEN CONVERT(VARCHAR(20), Values, 101)
ELSE Values
END AS Val1
FROM MyTable
答案 3 :(得分:0)
如果您的格式正好是mm/dd/yyyy hh:mm:ss AM/PM
select *
from somewhere
where Values like '[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] [AP]M'
AND ISDATE(Values) = 1