2017-06-06 376 views
1

在PostgreSQL中,如何使用一天的日期作爲輸入來獲取一週內所有日期的日期?例如,假設用戶在日曆用戶界面小部件中的某一天點擊。這突出了整個一週。Postgresql根據日曆日查詢一週的數據,不管哪一天

我想寫拉從那裏日期列日任何一天比賽中突出顯示的一週,表中的所有行的查詢,無論是否選擇週一,週三,用戶等

+0

你可以發佈你已經作出了嘗試? – kimdasuncion12

+0

有一天的映射到本週剩下的日子*是否會在SQL中發生?你可以在你的應用程序的邏輯中做到這一點嗎? –

+0

- 從時間表中選擇* clockin> current_date - interval'7 days'和employee_id = 32 - 從時間表中選擇*其中clockin> now():: date -8和employee_id = 32 order by clockin asc - select * from timetable,date_trunc('week',now():: date)其中employee_id = 32 - 選擇*,從週一提取(從clockin開始的周),從clockin開始提取(從clockin開始的月份) 32 –

回答

2

你應該合併一週的年,以使查詢在一年的結束/開始時保持穩定。例如: -

select * 
from some_table 
where to_char(some_date_column, 'iyyy-iw') = to_char(date '2017-06-06', 'iyyy-iw') 

iyyyiwISO week numbering。 ISO周總是在星期一開始。

或使用extract功能:

select * 
from some_table 
where (extract(isoyear from some_date_column), extract(week from some_date_column)) 
     = (extract(isoyear from date '2017-06-06'), extract(week from date '2017-06-06')) 

注意extract(week ...)始終是ISO星期。有沒有相應的「非ISO」關鍵字爲extract()功能

1

你最好的辦法是date_trunc('week', ts),像

WHERE date_trunc('week', ts_col) = date_trunc('week', ?) 

然而,這不會對ts_col使用索引。如果ts_coltimestamp [without time zone]date_trunc('week', ts_col)只能索引。 timestamptz(或timestamp with time zone)不能使用基於date_trunc()的表達式索引。但是你可以讓這個sargable有:

WHERE ts_col BETWEEN date_trunc('week', ?) AND date_trunc('week', ?) + interval '1 week' 

注意date_trunc('week', ...)使用一個星期的ISO概念,即所有的週週一開始。如果這對您不夠好,您可以調整以下表達式:date_trunc('day', ts) - interval '1 day' * extract(dow from ts)。這將計算f.ex.星期一從週日開始。如果你不是星期天瞄準等,只需用一些數學上的表達上面,如:

select date_trunc('day', ts) - interval '1 day' * extract(dow from ts) "sunday", 
     date_trunc('week', ts) "monday", 
     date_trunc('day', ts) - interval '1 day' * ((extract(dow from ts) + 5)::int % 7) "tuesday", 
     date_trunc('day', ts) - interval '1 day' * ((extract(dow from ts) + 4)::int % 7) "wednesday" 

http://rextester.com/KZX2905

相關問題