Netezza 将 UTC/GMT 转换为中央夏令时

Netezza Convert UTC/GMT to Central with Daylight Savings Time

我在 Netezza 数据库中工作,该数据库将时间存储为 GMT(或者我们的数据工程师告诉我的)。我需要能够将其转换为中央标准时间 (CST),但要考虑夏令时。我发现我可以使用类似的东西:

SELECT CURRENT_TIMESTAMP, CURRENT_TIMESTAMP AT TIME ZONE 'CST' AT TIME ZONE 'GMT'

但是,当我 运行 这个 SELECT (请记住,今天是 2021 年 3 月 30 日 - CST 应该与 GTM 仅相差 5 小时),我得到 6 小时的差异。 ...我查找了参考资料以查看 Netezza 中可用的时区,我看到“CDT”,即 5 小时,适用于 5 小时时差,但这意味着在我的查询中我会需要在每次 DST 切换时更改此设置或做某种详细的案例陈述以根据年份的 date/time 知道使用哪个。

是否有一种简单的自动化方法可以将 GTM 时间转换为考虑夏令时的中央标准时间?非常感谢!!!

这个问题可以用两种方式之一来解释。在这两种情况下,解决方案都是根据时间戳是否在 3 月第 2 个星期日凌晨 2 点到 11 月第 1 个星期日凌晨 2 点之间(美国中部时区)

来确定要转换到的时区
  1. 你的table中的时间戳,需要根据当前时间转换为CSTCDT(当查询运行时)
    • 这意味着如果同一个查询在 2 月份 运行,结果将不同于 运行 现在
    • 根据 netezza 系统的时区设置也会有所不同

例如

select 
  t as original, 
  -- extract year from current date and 2nd Sunday of March
  -- use last_day to make sure we account for March 1 being a Sunday
  (next_day(next_day(
           last_day((date_part('years', current_date) || '-02-01'):: date), 
        'sun'), 
      'sun')|| ' 02:00:00'):: timestamp as dstart, 
  -- extract year from current date and 1st Sunday of Nov
  -- use last_day to make sure we account for Nov 1 being a Sunday
  (next_day(last_day(
        (date_part('years', current_date) || '-10-01')::date), 
      'sun')|| ' 02:00:00'):: timestamp as dend, 
  case when current_timestamp between dstart 
  and dend then 'CDT' else 'CST' end as tz, 
  t at time zone tz as converted 
from 
  tdata;

会产生

      ORIGINAL       |       DSTART        |        DEND         | TZ  |       CONVERTED
---------------------+---------------------+---------------------+-----+------------------------
 2021-01-01 17:00:00 | 2021-03-14 02:00:00 | 2021-11-07 02:00:00 | CDT | 2021-01-01 12:00:00-05
 2021-04-01 17:00:00 | 2021-03-14 02:00:00 | 2021-11-07 02:00:00 | CDT | 2021-04-01 12:00:00-05
 2020-04-01 17:00:00 | 2021-03-14 02:00:00 | 2021-11-07 02:00:00 | CDT | 2020-04-01 12:00:00-05
 2020-12-01 17:00:00 | 2021-03-14 02:00:00 | 2021-11-07 02:00:00 | CDT | 2020-12-01 12:00:00-05
(4 rows)

  1. 您 table 中的时间戳需要转换为 CSTCDT,具体取决于相应 year 中夏令时 started/ended 的时间在时间戳中定义。
    • 这更具确定性
select 
  t as original, 
  -- extract year from this timestamp and 2nd Sunday of March
  -- use last_day to make sure we account for March 1 being a Sunday
  (next_day(next_day(
           last_day((date_part('years', t) || '-02-01'):: date), 'sun'), 
      'sun')|| ' 02:00:00'):: timestamp as dstart, 
  -- extract year from this timestamp and 1st Sunday of Nov
  -- use last_day to make sure we account for Nov 1 being a Sunday
  (next_day(last_day((date_part('years', t) || '-10-01')::date), 
      'sun')|| ' 02:00:00'):: timestamp as dend, 
  case when current_timestamp between dstart 
  and dend then 'CDT' else 'CST' end as tz, 
  t at time zone tz as converted 
from 
  tdata;

这将产生(tdata 是一个样本 table w/ 4 个时间戳)

      ORIGINAL       |       DSTART        |        DEND         | TZ  |       CONVERTED
---------------------+---------------------+---------------------+-----+------------------------
 2021-01-01 17:00:00 | 2021-03-14 02:00:00 | 2021-11-07 02:00:00 | CST | 2021-01-01 11:00:00-06
 2021-04-01 17:00:00 | 2021-03-14 02:00:00 | 2021-11-07 02:00:00 | CDT | 2021-04-01 12:00:00-05
 2020-04-01 17:00:00 | 2020-03-08 02:00:00 | 2020-11-01 02:00:00 | CDT | 2020-04-01 12:00:00-05
 2020-12-01 17:00:00 | 2020-03-08 02:00:00 | 2020-11-01 02:00:00 | CST | 2020-12-01 11:00:00-06
(4 rows)
system.admin(admin)=> select '2021-04-07 11:00:00' as gmt, timezone('2021-04-07 11:00:00' , 'GMT', 'America/New_York') as eastern, timezone('2021-04-07 11:00:00', 'GMT', 'America/Chicago') as central, timezone('2021-04-07 11:00:00', 'GMT', 'America/Los_Angeles') as pacific;
         gmt         |       eastern       |       central       |       pacific
---------------------+---------------------+---------------------+---------------------
 2021-04-07 11:00:00 | 2021-04-07 07:00:00 | 2021-04-07 06:00:00 | 2021-04-07 04:00:00
(1 row)

system.admin(admin)=> select '2021-03-07 11:00:00' as gmt, timezone('2021-03-07 11:00:00' , 'GMT', 'America/New_York') as eastern, timezone('2021-03-07 11:00:00', 'GMT', 'America/Chicago') as central, timezone('2021-03-07 11:00:00', 'GMT', 'America/Los_Angeles') as pacific;
         gmt         |       eastern       |       central       |       pacific
---------------------+---------------------+---------------------+---------------------
 2021-03-07 11:00:00 | 2021-03-07 06:00:00 | 2021-03-07 05:00:00 | 2021-03-07 03:00:00
(1 row)

如果我们使用 'America/Chicago' 而不是 CDT 和 CST,如上所示,它会处理夏令时。