如何从值中捕获确切的日期格式?

时间:2015-04-21 13:18:51

标签: sql sql-server tsql format case

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

4 个答案:

答案 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