Comment extraire l'année et le mois de la date dans PostgreSQL sans utiliser la fonction to_char ()?


104

Je veux sélectionner sql SELECT "year-month" from table group by "year-month" AND order by date:, où année-mois - format pour la date "1978-01", "1923-12". sélectionnez to_char du travail de couse , mais pas dans l'ordre "correct":

to_char(timestamp_column, 'YYYY-MM')

1
Pourquoi la commande n'est-elle pas correcte avec to_char?
yairchu

1
Voter pour fermer n'est pas clair car on ne sait pas pourquoi to_char () n'est pas acceptable.
Alex R

Réponses:


68
date_part(text, timestamp)

par exemple

date_part('month', timestamp '2001-02-16 20:38:40'),
date_part('year', timestamp '2001-02-16 20:38:40') 

http://www.postgresql.org/docs/8.0/interactive/functions-datetime.html


5
comment extraire le mois et l'année à la fois? pouvez-vous montrer un exemple
mokNathal

3
date_part ('mois', horodatage '2001-02-16 20:38:40'), date_part ('année', horodatage '2001-02-16 20:38:40')
MK.

merci pour une réponse rapide, mais ne pouvons-nous pas le faire en une seule fonction ou devons-nous l'appeler deux fois pour le mois et l'année séparément
mokNathal

2
Qu'essayez-vous de faire? Juste une chaîne? Ensuite, utilisez la fonction to_char avec un format de date dont vous avez besoin postgresql.org/docs/8.2/static/functions-formatting.html
MK.

181
to_char(timestamp, 'YYYY-MM')

Vous dites que l'ordre n'est pas «bon», mais je ne vois pas pourquoi il est faux (au moins jusqu'à ce que l'an 10 000 arrive).


si vous travaillez avec "timestamp" to_char (to_timestamp (e. "timestamp"), 'MM-YYYY')
Bruno Lee

@BrunoMarinho si vous voulez un ordre chronologique, alors n'utilisez pas 'MM-YYYY pour la commande'. Si vous voulez que cela soit affiché, vous pouvez toujours avoir une colonne dans ce format mais ne pas la commander
yairchu

4
Je ne comprends pas pourquoi ce n'est pas la réponse acceptée.
Prabowo Murti

Dans ce cas, vous ne pouvez pas ORDER BYsortir avec.
aagjalpankaj

1
@Aviator: Vous pouvez utiliser ORDER BY to_char(timestamp, 'YYYY-MM'). Ou bien si vous l'avez fait, SELECT to_char(timestamp, 'YYYY-MM') AS datevous pouvez simplement utiliser ORDER BY date.
yairchu

38

Utilisez la date_truncméthode pour tronquer le jour (ou tout ce que vous voulez, par exemple, semaine, année, jour, etc.)

Exemple de regroupement des ventes des commandes par mois:

select
  SUM(amount) as sales,
  date_trunc('month', created_at) as date
from orders
group by date
order by date DESC;

1
C'est vrai. Vous pouvez utiliser pour comparer: date (date_trunc ('month', now ())) = to_Date (5 :: varchar || '' || 2017 :: varchar, 'mm YYYY')
Alejandro Salamanca Mazuelo

Deux fois plus rapide que "to_char (timestamp, 'YYYY-MM')" qui est bien aussi.
Le Droid

20

Vous pouvez tronquer toutes les informations après le mois en utilisant date_trunc(text, timestamp):

select date_trunc('month',created_at)::date as date 
from orders 
order by date DESC;


Exemple:

Entrée:

created_at = '2019-12-16 18:28:13'

Sortie 1:

date_trunc('day',created_at)
// 2019-12-16 00:00:00

Sortie 2:

date_trunc('day',created_at)::date 
// 2019-12-16

Sortie 3:

date_trunc('month',created_at)::date 
// 2019-12-01

Sortie 4:

date_trunc('year',created_at)::date 
// 2019-01-01

16

1ère option

date_trunc('month', timestamp_column)::date

Il conservera le format de date avec tous les mois à partir du premier jour.

Exemple:

2016-08-01
2016-09-01
2016-10-01
2016-11-01
2016-12-01
2017-01-01

2e option

to_char(timestamp_column, 'YYYY-MM')

Cette solution proposée par @yairchu a bien fonctionné dans mon cas. Je voulais vraiment supprimer les informations du «jour».


11

Vous pouvez utiliser la fonction EXTRACT pgSQL

EX- date = 1981-05-31
EXTRACT(MONTH FROM date)
it will Give 05

Pour plus de détails PGSQL Date-Heure


1

Il fonctionne pour les fonctions «supérieures à» pas moins de.

Par exemple:

select date_part('year',txndt)
from "table_name"
where date_part('year',txndt) > '2000' limit 10;

fonctionne bien.

mais pour

select date_part('year',txndt)
from "table_name"
where date_part('year',txndt) < '2000' limit 10;

Je reçois une erreur.


Il fonctionne pour plus de fonctions pas pour moins de. Par exemple: sélectionnez date_part ('year', txndt) FROM "table_name" où date_part ('year', txndt)> '2000' limite 10; fonctionne bien. mais pour select date_part ('year', txndt) FROM "hpi_validator_q3". "cdm_inv_exceptions" où date_part ('year', txndt) <'2000' limit 10; Je reçois une erreur.
Anurag Bhardwaj

1
Ce n'est pas une réponse - si vous avez une question, postez plutôt une nouvelle question que d'ajouter votre question en tant que réponse.
Markoorn
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.