如何从值中获取准确的日期格式?

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