簡體   English   中英

如何在 PostgreSQL 中獲取周開始和結束日期字符串?

[英]How to get week start and end date string in PostgreSQL?

我正在使用PostgreSQL 8.3 我有一張這樣的表:

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

regist_time的數據類型是timestamp

我需要找到一個星期的時間間隔(開始到結束)和 sum(result) 作為 num。

我想得到如下結果:

      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

我可以得到今年的周數:

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

關鍵部分是

EXTRACT(WEEK FROM regis_time) 

提取功能只能獲得這一年的周數,如何獲得一周內的開始時間到結束時間?

您可以使用date_trunc('week', ...)

例如:

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

然后,如果您對開始時間不感興趣,可以將其轉換為日期。

要獲得結束日期:

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

(我在這里使用了默認格式,你當然可以調整它來使用MM / DD / YYYY。)

請注意,如果要對時間戳進行比較,而不是使用(date_trunc('week', ...) + '6 days'::interval ,則可能需要添加整周,並使用嚴格的比較本周末。

這將排除一周中最后一天的y時間戳(因為截止時間是當天的午夜)。

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

這將包括他們:

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

(在極少數情況下,您無法直接在y上使用date_trunc 。)


如果您的星期在星期日開始,將date_trunc('week', x)::date替換為date_trunc('week', x + '1 day'::interval)::date - '1 day'::interval應該有效。

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)

請參閱SQLFiddle的概念證明: http ://sqlfiddle.com/#!1 / 9e821 / 1

它是

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

在postgres中使用它

它會回來

2015-02-09

這可以幫助,查詢獲得當前周的所有日子。

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

2015年8月17日
2015年8月18日
2015年8月19日
二零一五年八月二十日
2015年8月21日

獲取周開始和結束日期(周一為0,周五為4):

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

2015年8月17日 - > 2015年8月21日

如果您想獲得周開始和結束日期,周開始日是一周中的任何一天(星期一,星期二,...)。 你可以這樣使用:

day_of_week_index映射:

{
    'monday': 1,
    'tuesday': 2,
    'wednesday': 3,
    'thursday': 4,
    'friday': 5,
    'saturday': 6,
    'sunday': 7
}

查詢模板:

SELECT 
concat(
    CASE
        WHEN extract(ISODOW FROM datetime_column) < day_of_week_index THEN cast(date_trunc('week', datetime_column) AS date) - 8 + day_of_week_index
        ELSE cast(date_trunc('week', datetime_column) AS date) - 1 + day_of_week_index
    END, ' - ', 
    CASE
        WHEN extract(ISODOW FROM datetime_column) < day_of_week_index THEN cast(date_trunc('week', datetime_column) AS date) - 8 + day_of_week_index + 6
        ELSE cast(date_trunc('week', datetime_column) AS date) - 1 + day_of_week_index + 6
    END) 
FROM table_name;

例子:

獲取周開始和結束日期,周開始日是星期二

SELECT 
concat(
    CASE
        WHEN extract(ISODOW FROM TIMESTAMP '2021-12-01 03:00:00') < 2 THEN cast(date_trunc('week', TIMESTAMP '2021-12-01 03:00:00') AS date) - 8 + 2
        ELSE cast(date_trunc('week', TIMESTAMP '2021-12-01 03:00:00') AS date) - 1 + 2
    END, ' - ', 
    CASE
        WHEN extract(ISODOW FROM TIMESTAMP '2021-12-01 03:00:00') < 2 THEN cast(date_trunc('week', TIMESTAMP '2021-12-01 03:00:00') AS date) - 8 + 2 + 6
        ELSE cast(date_trunc('week', TIMESTAMP '2021-12-01 03:00:00') AS date) - 1 + 2 + 6
    END);

=> 結果:

2021-11-30 - 2021-12-06

注意:您可以按照上述映射更改day_of_week_index以確定一周的開始日期(星期一、星期二、...、星期日)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM