Generate_series dans Postgres de début et date de fin dans une table
J'ai essayé de générer une série de dates (AAAA-MM-JJ HH) à partir de la première jusqu'à la dernière date dans un champ d'horodatage. J'ai la generate_series()
j'ai besoin, cependant en cours d'exécution dans un problème lorsque vous essayez d'attraper le début et dates de fin à partir d'une table. J'ai le texte suivant pour donner une idée:
with date1 as
(
SELECT start_timestamp as first_date
FROM header_table
ORDER BY start_timestamp DESC
LIMIT 1
),
date2 as
(
SELECT start_timestamp as first_date
FROM header_table
ORDER BY start_timestamp ASC
LIMIT 1
)
select generate_series(date1.first_date, date2.first_date
, '1 hour'::interval)::timestamp as date_hour
from
( select * from date1
union
select * from date2) as foo
Postgresql 9.3
Comme toujours, votre version de Postgres s'il vous plaît. Quel est exactement le "problème" que vous mentionnez?
Postgres v9.3 - toutes mes excuses!
Postgres v9.3 - toutes mes excuses!
OriginalL'auteur SiriusBits | 2015-03-13
Vous devez vous connecter pour publier un commentaire.
Vous avez certainement ne pas besoin d'un CTE pour cela. Ce serait plus cher que nécessaire.
Et vous n'avez pas besoin de jeter à
timestamp
parce que le résultat déjà est de type de donnéestimestamp
lorsque vous nourrissezdate
types degenerate_series()
.Dans Postgres 9.3 ou tard, ce qui est le plus élégamment résolu avec un
LATERAL
rejoindre:Éventuellement avec
to_char()
pour obtenir le résultat sous forme de texte dans le format que vous avez mentionné.En plus tôt (ou pas du tout) versions:
Mais l'appel de set-de retour des fonctions dans le
SELECT
liste est non-fonctionnalité standard et mal vu par certains. L'utilisation de la première requête si vous le pouvez.Note une différence subtile dans NULL manipulation:
L'équivalent de
est obtenu avec
Sans
NULLS LAST
les valeurs NULL venir première dans l'ordre décroissant (si il y peut être des valeurs NULL dansstart_timestamp
). Vous obtenez la valeur NULL pourlast_date
et votre requête serait venu vide.Détails:
J'ai accepté ce que le droit de réponse suite à l'évaluation de Gordon Linoff et Used_By_Already. Leurs réponses où les grands de ce, et fonctionnent bien. Cependant, cette rasée environ 20-30ms hors du temps. Dans un grand système en cours d'exécution presque 24x7 sur des centaines de tableaux, cela fera une différence (quoique cependant les petits).
Dans le premier exemple de code qu'est-ce que le
g(ts);
référence?sont table et de la colonne alias (en omettant le mot-clé facultatif
AS
) . Voir: postgresql.org/docs/current/static/...OriginalL'auteur Erwin Brandstetter
Comment sur l'utilisation des fonctions d'agrégation à la place?
Ou encore:
OriginalL'auteur Gordon Linoff
essayez ceci:
NB: Vous voulez les 2 dates dans un ligne, pas sur des lignes distinctes.
voir ce sqlfiddle démo
OriginalL'auteur Used_By_Already