SQL TRY_CONVERT DateTime vs DateTime2

时间:2017-03-30 00:23:56

标签: sql sql-server datetime datetime2

我有一种情况需要将列中的日期时间字符串值转换为更标准化的格式,转换过程是安静的手动我不仅仅是铸造和存储。
因此,脚本会抓取值,对其进行摸索并将其以ODBC格式存储在同一单元格中。问题是我需要能够检查存储在单元格中的值是否已经被转换,或者仍然需要处理,因为脚本需要重新运行。

所以我的示例情况是我遇到以下两个值:

08/03/2017 3:51 PM
28/03/2017 7:30 AM

现在我知道这是第一天的事实。

如果我使用

TRY_CONVERT(DATETIME, [Value], 121)

我会得到结果值:

2017-08-03 15:51:00.000
NULL

现在我想两者都是NULL,所以它对于第二个值是正确的,但不是第一个值,更糟糕的是它交换了第一个的日期和月份组件。

但是,如果我使用

TRY_CONVERT(DATETIME2, [Value], 121)

我对两个音符都得到NULL,所以我的问题是用DATETIME和DATETIME2转换有什么区别?为什么DATETIME2为第一个返回NULL?

我知道它为第二个值返回NULL,因为第一个组件大于12。

旁注:

在我的脚本结束时,我最终得到了值的ODBC表单(可能应该是ISO?)

2016-06-07 03:23:17.000
2016-06-07 03:23:17.000

当我跑步时

TRY_CONVERT(DATETIME2, [Value], 121)

我很高兴得到的不是NULL值,所以我不必将其转换为:)

1 个答案:

答案 0 :(得分:1)

如果您需要将第一天转换为ODBC规范(使用毫秒),则可以使用set dateformat dmytry_convert(datatype,val)而不使用style组件。

转换回datetime / datetime2后,将121样式应用回char()进行字符串存储。

create table t (dt varchar(32));
insert into t values ('08/03/2017 3:51 PM'),('28/03/2017 7:30 AM');

set dateformat dmy;
select 
    dt
  , tryparse      = convert(char(23),try_parse(dt as datetime2(3)),121) 
  , tryparseBrit  = convert(char(23),try_parse(dt as datetime2(3) using 'en-GB'),121) 
  , tryconvert    = convert(char(23),try_convert(datetime2(3),dt),121) 
  , tryconvert121 = convert(char(23),try_convert(datetime2(3),dt,121),121) 
  , trycast       = convert(char(23),try_cast(dt as datetime2(3)),121)
from t

rextester演示:http://rextester.com/GFC92046

返回:

+--------------------+-------------------------+-------------------------+-------------------------+---------------+-------------------------+
|         dt         |        tryparse         |      tryparseBrit       |       tryconvert        | tryconvert121 |         trycast         |
+--------------------+-------------------------+-------------------------+-------------------------+---------------+-------------------------+
| 08/03/2017 3:51 PM | 2017-08-03 15:51:00.000 | 2017-03-08 15:51:00.000 | 2017-03-08 15:51:00.000 | NULL          | 2017-03-08 15:51:00.000 |
| 28/03/2017 7:30 AM | NULL                    | 2017-03-28 07:30:00.000 | 2017-03-28 07:30:00.000 | NULL          | 2017-03-28 07:30:00.000 |
+--------------------+-------------------------+-------------------------+-------------------------+---------------+-------------------------+

要选择尚未转换的值,您可以使用:

... where dt not like '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]%'