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')
Bdfy
la source
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

MK.
la source
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).

Yairchu
la source
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;
Gerry Shaw
la source
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
Aya
la source
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».

Luis Martins
la source
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

Singhak
la source
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.

Anurag Bhardwaj
la source
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