2017-10-09 2 views
0

J'ai une table qui contient une colonne date et une colonne varchar qui contient un fuseau horaire. Je voudrais écrire une requête qui sélectionne toutes les lignes où la date à minuit dans le fuseau horaire est avant un timestamp with time zone donné.Comparer une date et un fuseau horaire à un timestamptz dans Postgresql

Par exemple, étant donné

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'); 

Comment pourrais-je écrire une requête pour trouver tous les scheduled_tasks qui devrait être exécuté à 2017-10-15T06:00:00Z, étant donné que je veux chaque tâche soit exécutée après minuit dans son fuseau horaire associé? (Je veux donc les tâches de Tokyo et de New York, mais pas celles de Los Angeles, puisque 2017-10-15T06:00:00Z est 11:00 le 14 à Los Angeles.)

Je vois la fonction make_timestamptz, mais c'est ma meilleure option vraiment être:

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

Répondre

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

dans cette requête, je crée d'abord le temps dans le fuseau horaire particulier, le temps d'exécution prévu à l'UTC, et comparer.