Comment obtenir le dernier jour du mois dans postgres?
Comment trouver le dernier jour de l'os du mois postgres?
J'ai une date de colonnes stockées en tant que numérique(18) dans le format(AAAAMMJJ)
Je suis en train d'essayer de la rendre la date à l'aide de
to_date("act_dt",'YYYYMMDD') AS "act date"
ensuite, trouver le dernier jour de cette date:
comme ceci:
(select (date_trunc('MONTH',to_date("act_dt",'YYYYMMDD')) + INTERVAL '1 MONTH - 1 day')::date)
mais il me donne cette erreur:
ERROR: Interval values with month or year parts are not supported
Detail:
-----------------------------------------------
error: Interval values with month or year parts are not supported
code: 8001
context: interval months: "1"
query: 673376
location: cg_constmanager.cpp:145
process: padbmaster [pid=20937]
-----------------------------------------------
Toute aide?
Postgres version:
PostgreSQL 8.0.2 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3), Redshift 1.0.874
to_date
convertit uniquement les chaînes de dates. Si votre colonne contient l'époque Unix valeurs, vous devez utiliserto_timestamp
:to_timestamp(act_dt)::date
.- ERREUR: la fonction to_timestamp(numérique) n'existe pas Hint: Pas de fonction correspond au nom donné et les types d'argument. Vous pouvez avoir besoin d'ajouter de type explicite jette. ?
to_timestamp
s'attend à ce double précision, essayez de coulée de votre colonne d'elle:to_timestamp(act_dt::float8)::date
. BTW, pourriez-vous confirmer que cette colonne magasins de l'époque Unix valeurs de temps? Si ce n'est pas le cas, vous devez fournir une explication dans votre question, qu'est-ce exactement le stockage.- Vous pouvez faire votre calcul en remplaçant votre
INTERVAL '1 MONTH - 1 day'
parINTERVAL '1 MONTH' - interval '1 day'
- la colonne a de telles valeurs act_dt
20131014 20130614 20150124 20110128 20120825
- OK, alors, de la ferraille tout ce que j'ai écrit, @Houari réponse doit travailler pour vous. Bien que je recommanderais fortement pour stocker les valeurs de date à l'aide de type date (bien sûr, si ce n'est pas un système d'héritage, où il n'est pas à vous de décider des types de colonnes).
- SÉLECTIONNEZ (date_trunc ("MOIS", Current_Date) + INTERVAL '1 MOIS - 1 jour')::DATE;
Vous devez vous connecter pour publier un commentaire.
Simplement à l'aide de la last_day fonction:
PS: Maintenant, je crois que vous savez qu'il est très important de choisir les bonnes balises pour votre propre question!
ERROR: Interval values with month or year parts are not supported Detail: ----------------------------------------------- error: Interval values with month or year parts are not supported code: 8001 context: interval months: "1" query: 674275
de l'aide?select version()
à votre question.numeric
, je ne vois pas le problème de l'exécution de ma réponse, même sur Pré-histrical version :sdate columns stored as numeric(18)
select dateadd(day,-1,dateadd(month,1,date_trunc('month',to_date(to_char(act_dt,'99999999'), 'YYYYMMDD'))))
20111024 2011-11-30 00:00:00 20150127 2019-02-28 00:00:00 20150127 2019-02-28 00:00:00 20150127 2019-02-28 00:00:00 20150127 2019-02-28 00:00:00
pour 20150127 il donne 2019-02-28?last_day
fonction, pourriez-vous s'il vous plaît essayer:select last_day(to_date(to_char(act_dt,'99999999'), 'YYYYMMDD'))
?select last_day(to_date(act_date,'YYYYMMDD'))
last_day()
n'est pas une Postgres fonction. Bien qu'il aurait de travail pour l'affiche originale (qui fait dire à la fin qu'ils exécutentPostgreSQL 8.0.2
sur AWS Redshift) il n'est pas réellement une réponse à la question posée, plus précisément "Comment obtenir le dernier jour du mois dans postgres?"Pour tout le monde de venir à cette question, la recherche de la Postgres façon de le faire (n'utilisant pas de Décalage vers le rouge), voici comment vous pouvez le faire:
Remplacement de la
'2017-01-05'
avec quelle que soit la date que vous souhaitez utiliser. Vous pouvez faire cela dans une fonction comme ceci:Ok, donc vous avez un
numeric(18)
colonne contenant des nombres comme20150118
. Vous pouvez convertir une date comme:À partir d'une date, vous pouvez saisir le dernier jour du mois comme:
Combiné, vous devez obtenir:
Exemple en SQL, Violon.
integer date
,besoin de le faire à la date puis l'utiliser à la place de now().. quelque chose comme cela ne fonctionne pas(select (date_trunc('MONTH',to_date("act_dt",'YYYYMMDD')) + INTERVAL '1 MONTH - 1 day')::date) it gives me error as above
to_timestamp(act_dt::float)
travail? Où::type
est une Postgres type de fonte.to_date("act_dt",'YYYYMMDD')
date
objet, il n'est pas nécessaire d'utilisertimestamp()
sur elle. Essayez la mise à jour de réponse?date columns stored as numeric(18)
Pour de futures recherches, Redshift n'accepte pas
INTERVAL '1 month'
. Au lieu d'utiliserdateadd(month, 1, date)
comme documenté ici.Pour obtenir la fin du mois utilisation:
DATEADD(DAY, -1, (DATE_TRUNC('month', DATEADD(MONTH, 1, date))))
select to_char(date_trunc('mois', now() + '01 Mois::intervalle) - '01'::intervalle, 'YYYYmmDD'::text)::numeric comme end_period_n