-2

我有字符串'Tue,2021 年 12 月 7 日 04:35:05 GMT',我需要转换为 smalldatetime 格式,如 '2021-12-07 04:35:05'(yyyy-mm-dd hh:mm:ss) sql服务器。请帮忙。提前致谢。

4

2 回答 2

0

以防日期时间字符串不仅在 GMT 时区。
如果您想在固定时区有一个小的日期时间。

这是一个使用参考表的演示。

样本数据

create table ref_timezones (
 tz_code varchar(8) primary key, 
 tz_offset char(6) not null check (tz_offset like '[+-][01][0-9]:[0-9][0-9]'), 
 name varchar(30)
);

insert into ref_timezones (
tz_code, 
tz_offset
) values
('CDT',  '-05:00'),
('EST',  '-05:00'),
('Z',    '+00:00'),
('GMT',  '+00:00'),
('+00:00', '+00:00'),
('CET',  '+01:00'),
('CEST', '+02:00'), 
('ACDT', '+10:30');

create table test (col varchar(30));
insert into test (col) values
  ('Tue, 07 Dec 2021 04:35:05 GMT')
, ('Wed, 08 Dec 2021 05:46:36 CEST')

询问

SELECT col
, TRY_CAST(SUBSTRING(col,6,20) AS DATETIME) AS dt_no_offset
, CAST(SWITCHOFFSET(
    TRY_CAST(
      SUBSTRING(col, PATINDEX('%[0-9]%', col), 21)
    + COALESCE(tz.tz_offset, '+00:00')
    AS DATETIMEOFFSET(0)), '+00:00') AS SMALLDATETIME) AS small_dt_at_zulu
FROM test
OUTER APPLY (
   SELECT tz_offset
   FROM ref_timezones 
   WHERE tz_code = RIGHT(col, PATINDEX('%_[ ][0-9][0-9]:%', REVERSE(col)))
) tz;
山口 dt_no_offset small_dt_at_zulu
格林威治标准时间 2021 年 12 月 7 日星期二 04:35:05 2021-12-07 04:35:05.000 2021-12-07 04:35
2021 年 12 月 8 日星期三 05:46:36 CEST 2021-12-08 05:46:36.000 2021-12-08 03:47

db<>在这里摆弄

于 2022-01-19T17:15:34.197 回答
0

如果您从值中截断日期名称和时区,并且您使用的是基于英语的语言,则此方法有效。我假设您的值始终采用以下格式ddd, dd MMM yyyy hh:mm:ss tz

SELECT TRY_CONVERT(smalldatetime, SUBSTRING('Tue, 07 Dec 2021 04:35:05 GMT',6,20);

请注意,smalldatetime精确到 1 分钟,因此会丢失秒精度。因此,对于您的价值,2021-12-07 04:35:00将被退回。

于 2022-01-19T14:37:09.260 回答