0

J'essaie de générer une série d'horodatages, de calculer le jour de la semaine pour chaque horodatage et de sélectionner uniquement les horodatages qui tombent du lundi au samedi, en utilisant PostGreSQL.Comment puis-je obtenir des champs uniques lors de la construction d'une table en utilisant Common Table Expression (CTE) dans PostgreSQL?

Voici ma tentative à ce jour:

WITH 
candidates AS (SELECT * FROM generate_series(
    date_trunc('hour', CURRENT_TIMESTAMP - INTERVAL '2 hours'), 
    date_trunc('hour', CURRENT_TIMESTAMP - INTERVAL '2 hours')+INTERVAL '1 week', 
    INTERVAL '1 hour')), 
candidows AS (SELECT EXTRACT(DOW FROM generate_series) FROM candidates), 
candidatable AS (SELECT b.date_part AS dow, a.generate_series as start_booking FROM candidates a, candidows b) 
SELECT * FROM candidatable WHERE dow != 0; 

La vue renvoyée comprend une colonne dow qui se comporte comme je le pense, mais la colonne de start_booking ne contient que la même valeur répétée:

dow |  start_booking 
-----+------------------------ 
    2 | 2017-09-19 11:00:00+01 
    2 | 2017-09-19 11:00:00+01 
    2 | 2017-09-19 11:00:00+01 
    2 | 2017-09-19 11:00:00+01 
    2 | 2017-09-19 11:00:00+01 
    2 | 2017-09-19 11:00:00+01 
    2 | 2017-09-19 11:00:00+01 
    2 | 2017-09-19 11:00:00+01 
    2 | 2017-09-19 11:00:00+01 
    2 | 2017-09-19 11:00:00+01 
    2 | 2017-09-19 11:00:00+01 
    2 | 2017-09-19 11:00:00+01 
    2 | 2017-09-19 11:00:00+01 
    3 | 2017-09-19 11:00:00+01 
    3 | 2017-09-19 11:00:00+01 
    3 | 2017-09-19 11:00:00+01 

Si je remplacer la dernière instruction SELECT par:

SELECT * FROM candidates; 

Puis les données que j'essaie de rivaliser w comme start_booking ci-dessus sont séquentiels, comme je l'attends:

generate_series 
------------------------ 
2017-09-19 11:00:00+01 
2017-09-19 12:00:00+01 
2017-09-19 13:00:00+01 
2017-09-19 14:00:00+01 
2017-09-19 15:00:00+01 
2017-09-19 16:00:00+01 

Que puis-je faire pour obtenir les données de candidates.generate_series apparaître comme candidatables.start_booking?

Répondre

1

une conjecture sauvage - essayez-vous:

WITH 
candidates AS (SELECT generate_series start_booking, EXTRACT(DOW FROM generate_series) dow FROM generate_series(
    date_trunc('hour', CURRENT_TIMESTAMP - INTERVAL '2 hours'), 
    date_trunc('hour', CURRENT_TIMESTAMP - INTERVAL '2 hours')+INTERVAL '1 week', 
    INTERVAL '1 hour')) 
SELECT * FROM candidates WHERE dow != 0; 

..

+0

Ceci est bien meilleur comportement, mais je ne veux pas vraiment le résultat d'inclure une colonne appelée « generate_series »?. Est-ce que je peux renommer ça? – CnrL

+1

édité pour inclure l'alias voulu –