2017-10-09 227 views
0

我有一張表,其中包含一個date列和一個包含時區的varchar列。我想編寫一個查詢,選擇時區中午夜的日期在給定的timestamp with time zone之前的所有行。將日期和時區與Postgresql中的時間戳比較

例如,給定

CREATE TABLE scheduled_tasks (
    id serial primary key, 
    run_date date not null, 
    customer_timezone varchar not null 
); 

INSERT INTO scheduled_tasks(run_date, customer_timezone) VALUES 
    ('2017-10-15', 'America/Los_Angeles'), 
    ('2017-10-15', 'America/New_York'), 
    ('2017-10-15', 'Asia/Tokyo'); 

我將如何編寫一個查詢發現,應在2017-10-15T06:00:00Z運行所有scheduled_tasks,因爲我想在其相關的時區午夜後要運行的每個任務嗎? (所以我想在東京和紐約的任務,而不是洛杉磯的一個,因爲2017-10-15T06:00:00Z是晚上11:00在洛杉磯的第14位。)

我看到make_timestamptz功能,但是是我最好的選擇真的要是:

SELECT * 
FROM scheduled_tasks 
WHERE make_timestamptz(
    EXTRACT (YEAR from run_date)::int, 
    EXTRACT (MONTH from run_date)::int, 
    EXTRACT (DAY from run_date)::int, 
    0, 
    0, 
    0.0, 
    customer_timezone) < '2017-10-15T06:00:00'; 

SqlFiddle:http://sqlfiddle.com/#!17/a8e38/4/0

回答

1
SELECT run_date::timestamp AT TIME ZONE customer_timezone < '2017-10-15T06:00:00Z'::timestamptz 
FROM scheduled_tasks; 

在此查詢我先在特定時區的時間,然後在UTC的預期運行時間,並進行比較。