web-dev-qa-db-fra.com

Comment obtenir une chaîne de dates de début et de fin de semaine dans PostgreSQL?

J'utilise PostgreSQL 8.. J'ai une table comme celle-ci:

id        regist_time        result
-----------------------------------
1     2012-07-09 15:00:08      3
2     2012-07-25 22:24:22      7
4     2012-07-07 22:24:22      8

Le type de données de regist_time Est timestamp.

J'ai besoin de trouver un intervalle de temps d'une semaine (du début à la fin) et une somme (résultat) sous forme de num.

Je veux obtenir le résultat comme:

      week                    num    
---------------------------------
7/1/2012-7/7/2012              10
7/8/2012-7/14/2012              5
7/15/2012-7/21/2012             3
7/22/2012-7/28/2012            11

Je peux obtenir le numéro de semaine juste cette année:

SELECT id,regis_time, EXTRACT(WEEK FROM regis_time) AS regweek
FROM tba

La partie clé est

EXTRACT(WEEK FROM regis_time) 

la fonction d'extraction ne peut obtenir le numéro de semaine que cette année, comment puis-je obtenir l'heure de début à l'heure de fin en une semaine?

28
diligent

Vous pouvez utiliser date_trunc('week', ...) .

Par exemple:

SELECT date_trunc('week', '2012-07-25 22:24:22'::timestamp);
-> 2012-07-23 00:00:00

Ensuite, vous pouvez convertir cela en une date, si vous n'êtes pas intéressé par une heure de début.

Pour obtenir également la date de fin:

SELECT    date_trunc('week', '2012-07-25 22:24:22'::timestamp)::date
   || ' '
   || (date_trunc('week', '2012-07-25 22:24:22'::timestamp)+ '6 days'::interval)::date;

-> 2012-07-23 2012-07-29

(J'ai utilisé le formatage par défaut ici, vous pouvez bien sûr l'adapter pour utiliser MM/DD/YYYY.)

Notez que, si vous souhaitez faire des comparaisons sur les horodatages, au lieu d'utiliser (date_trunc('week', ...) + '6 days'::interval, Vous pouvez ajouter une semaine entière et utiliser une comparaison stricte pour la fin de la semaine.

Cela exclura y horodatages le dernier jour de la semaine (car l'heure limite est minuit le jour).

    date_trunc('week', x)::date <= y::timestamp
AND y::timestamp <= (date_trunc('week', x) + '6 days'::interval)::date

Cela comprendra:

    date_trunc('week', x)::date <= y::timestamp
AND y::timestamp < (date_trunc('week', x) + '1 week'::interval)

(C'est dans les rares cas où vous ne pouvez pas utiliser date_trunc Sur y directement.)


Si votre semaine commence un dimanche, remplacer date_trunc('week', x)::date par date_trunc('week', x + '1 day'::interval)::date - '1 day'::interval devrait fonctionner.

60
Bruno
select date_trunc('week', regist_time)::date || ' - ' ||
       (date_trunc('week', regist_time) + '6 days') ::date as Week,
       sum(result) Total
from YourTable
group by date_trunc('week', regist_time)
order by date_trunc('week', regist_time)

Voir la preuve de concept sur SQLFiddle: http://sqlfiddle.com/#!1/9e821/1

14
Adrian Carneiro

Il est

select to_date('2015-07', 'IYYY-IW');

l'utiliser en postgres

il reviendra

2015-02-09
3
Mohamed Sami

Cela peut aider, une requête pour obtenir tous les jours de la semaine en cours.

select cast(date_trunc('week', current_date) as date) + i
from generate_series(0,6) i

2015-08-17
2015-08-18
2015-08-19
2015-08-20
2015-08-21

Pour obtenir la date de début et de fin de la semaine (0 pour le lundi et 4 pour le vendredi):

select cast(date_trunc('week', current_date) as date) + 0 || '-->' ||  cast(date_trunc('week', current_date) as date) + 4;

2015-08-17 -> 2015-08-21

2
Ahmed MANSOUR