137 votes

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

Je veux sélectionner sql : SELECT "year-month" from table group by "year-month" AND order by date où année-mois - format de la date "1978-01", "1923-12". Sélectionnez la lettre "to_char" de "couse work". mais pas le "bon" ordre :

to_char(timestamp_column, 'YYYY-MM')

1 votes

Pourquoi l'ordre n'est pas bon avec to_char ?

1 votes

Vote pour fermer comme non clair parce qu'il n'est pas clair pourquoi to_char() n'est pas acceptable.

229voto

yairchu Points 9694
to_char(timestamp, 'YYYY-MM')

Vous dites que l'ordre n'est pas "bon", mais je ne vois pas pourquoi il est mauvais (du moins jusqu'à l'année 10000).

0 votes

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

0 votes

@BrunoMarinho si vous voulez un ordre chronologique, il suffit de ne pas utiliser "MM-AAAA pour le classement". Si vous voulez que cela s'affiche, vous pouvez toujours avoir une colonne dans ce format, mais n'utilisez pas cet ordre.

5 votes

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

91voto

MK. Points 11889
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

7 votes

Comment extraire le mois et l'année en une seule fois ? pouvez-vous montrer un exemple ?

3 votes

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

0 votes

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

45voto

Gerry Points 2710

Utilisez le date_trunc pour tronquer le jour (ou tout autre élément que vous souhaitez, par exemple, la semaine, l'année, le jour, etc.)

Exemple de regroupement des ventes à partir 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 votes

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

0 votes

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

36voto

Aya Points 261

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;

Ejemplo:

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

0 votes

Comment faire date_trunc('month',created_at) et ne retourner que 'YYYY-mm' ?

20voto

Luis Martins Points 559

1ère option

date_trunc('month', timestamp_column)::date

Il conservera le format de date avec tous les mois commençant au premier jour.

Ejemplo:

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

2ème option

to_char(timestamp_column, 'YYYY-MM')

Cette solution proposée par @yairchu a bien fonctionné dans mon cas. Je voulais vraiment supprimer l'information "jour".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X