1

我有一种情况,我需要将列中的日期时间字符串值转换为更标准化的格式,转换过程是安静的手动我不只是转换和存储。
因此,脚本会抓取该值,对其进行摸索,然后以 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 值,所以我不必隐藏它:)

4

1 回答 1

2

如果您需要先将日期转换为 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]%'
于 2017-03-30T00:45:00.180 回答