如何从值中获取准确的日期格式?
How to catch exact date format from value?
在 MyTable
中是 NVARCHAR
数据类型的名为 Values
的列。这里放置了许多值,例如:
Alisa
20150111
Something 12
Etc 2222
4444
01/21/2015 11:01:12 AM
etc
我需要 select 此列中的所有值,但格式类似于 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
也许尝试检查字符串是否包含 /
,如下所示:
SELECT CASE WHEN ISDATE(Values) = 1 and CHARINDEX('/',Values) > 0
THEN CONVERT(VARCHAR(20), Values, 101)
ELSE Values
END AS Val1
FROM MyTable
尝试
SELECT CASE WHEN Values LIKE '__/__/____%' THEN CONVERT(VARCHAR(20), Values, 101)
ELSE Values
END AS Val1
FROM MyTable
如果您的格式正好是 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
此脚本将验证正确格式的日期,如果是日期,则取前 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
在 MyTable
中是 NVARCHAR
数据类型的名为 Values
的列。这里放置了许多值,例如:
Alisa
20150111
Something 12
Etc 2222
4444
01/21/2015 11:01:12 AM
etc
我需要 select 此列中的所有值,但格式类似于 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
也许尝试检查字符串是否包含 /
,如下所示:
SELECT CASE WHEN ISDATE(Values) = 1 and CHARINDEX('/',Values) > 0
THEN CONVERT(VARCHAR(20), Values, 101)
ELSE Values
END AS Val1
FROM MyTable
尝试
SELECT CASE WHEN Values LIKE '__/__/____%' THEN CONVERT(VARCHAR(20), Values, 101)
ELSE Values
END AS Val1
FROM MyTable
如果您的格式正好是 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
此脚本将验证正确格式的日期,如果是日期,则取前 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