Presto:如何使用当前日期和时区指定时间间隔

如何重写以下查询:

WHERE (
    parsedTime BETWEEN 
    TIMESTAMP '2019-10-29 00:00:00 America/New_York' AND
    TIMESTAMP '2019-11-11 23:59:59 America/New_York'
) 

但要使间隔动态化:从14天前到current_date

pw942mn 回答:Presto:如何使用当前日期和时区指定时间间隔

Presto在date and time functions and operations中提供了非常方便的功能interval

-- Creating sample dataset
WITH dataset AS (
  SELECT
    'engineering' as department,ARRAY[
        TIMESTAMP '2019-11-05 00:00:00',TIMESTAMP '2018-10-29 00:00:00'
    ] as parsedTime_array
)
SELECT department,parsedTime FROM dataset
CROSS JOIN UNNEST(parsedTime_array) as t(parsedTime)

-- Filtering records for the past 14 days from current_date
WHERE(
    parsedTime > current_date - interval '14' day
)

结果

    | department    | parsedTime
---------------------------------------
1   | engineering   | 2019-11-05 00:00:00.000

更新2019-11-11

注意current_date返回查询开始时的当前日期。我认为,雅典娜会一直使用UTC时间,但不是100%确定。因此,要提取特定时区中的当前日期,我建议使用带时区转换的时间戳。

current_timestamp = current_timestamp at TIME ZONE 'America/New_York'

因为AT TIME ZONE表示同一时刻,但仅在用于打印它们的时区不同。但是,由于有5个小时的偏移,以下情况并不总是正确的。

DATE(current_timestamp) = DATE(current_timestamp at TIME ZONE 'America/New_York')

可以通过以下方式轻松验证:

WITH dataset AS (
  SELECT
    ARRAY[
        TIMESTAMP '2019-10-29 23:59:59 UTC',TIMESTAMP '2019-10-30 00:00:00 UTC',TIMESTAMP '2019-10-30 04:59:59 UTC',TIMESTAMP '2019-10-30 05:00:00 UTC'
    ] as parsedTime_array
)
SELECT
    parsedTime AS "Time UTC",DATE(parsedTime) AS "Date UTC",DATE(parsedTime at TIME ZONE 'America/New_York') AS "Date NY",to_unixtime(DATE(parsedTime)) AS "Unix UTC",to_unixtime(DATE(parsedTime at TIME ZONE 'America/New_York')) AS "Unix NY"
FROM
    dataset,UNNEST(parsedTime_array) as t(parsedTime)

结果。在这里我们可以看到 2 纽约时标分为2019-10-292019-10-30,而对于UTC时标仅为1和3分别。

 Time UTC                    | Date UTC   | Date NY    | Unix UTC   | Unix NY    
-----------------------------|------------|------------|------------|------------
 2019-10-29 23:59:59.000 UTC | 2019-10-29 | 2019-10-29 | 1572307200 | 1572307200 
 2019-10-30 00:00:00.000 UTC | 2019-10-30 | 2019-10-29 | 1572393600 | 1572307200 
 2019-10-30 04:59:59.000 UTC | 2019-10-30 | 2019-10-30 | 1572393600 | 1572393600 
 2019-10-30 05:00:00.000 UTC | 2019-10-30 | 2019-10-30 | 1572393600 | 1572393600 

现在,让我们快进一个月。 NY on 3rd or November 2019中的冬季发生了变化。但是,UTC格式的时间戳不受此影响。因此:

WITH dataset AS (
  SELECT
    ARRAY[
        TIMESTAMP '2019-11-29 23:59:59 UTC',TIMESTAMP '2019-11-30 00:00:00 UTC',TIMESTAMP '2019-11-30 04:59:59 UTC',TIMESTAMP '2019-11-30 05:00:00 UTC'
    ] as parsedTime_array
)
SELECT
    parsedTime AS "Time UTC",UNNEST(parsedTime_array) as t(parsedTime)

结果。在这里我们可以看到 3 纽约时间戳记属于2019-11-29,而 1 属于2019-11-30 ,而对于UTC时间戳,比率仍为1/3。

 Time UTC                    | Date UTC   | Date NY    | Unix UTC   | Unix NY    
-----------------------------|------------|------------|------------|------------
 2019-11-29 23:59:59.000 UTC | 2019-11-29 | 2019-11-29 | 1574985600 | 1574985600 
 2019-11-30 00:00:00.000 UTC | 2019-11-30 | 2019-11-29 | 1575072000 | 1574985600 
 2019-11-30 04:59:59.000 UTC | 2019-11-30 | 2019-11-29 | 1575072000 | 1574985600 
 2019-11-30 05:00:00.000 UTC | 2019-11-30 | 2019-11-30 | 1575072000 | 1575072000 

此外,不同的国家/地区在不同的日期切换到冬季/夏季时间。例如,在2019年,伦敦(英国)将时钟向27 October 2019移了1小时,而纽约(美国)将时钟向3 November 2019移了1小时。

本文链接:https://www.f2er.com/3124067.html

大家都在问