2013-08-27 108 views
0

我需要計算兩個日期之間特定日期的數量(例如星期三&星期四)。計算兩個日期之間的特定星期幾

我知道時間函數和所有相關的函數,但我不知道如何在這種情況下使用它們。


這個問題在兩個解決方案中解決了,但是看起來我不能選擇展位解決方案。 謝謝Andrius NaruševičiusKickstart你的啓示:d

+0

這對你有用嗎? http://stackoverflow.com/questions/2546053/mysql-difference-between-two-timestamps-in-days – alpera

+0

谷歌第一 - .-第一個結果做你想要的 - http://stackoverflow.com/questions/9757919/ count-days-between-dates-excluded-weekends-mysql-only –

+0

@alpera恕我直言,datediff計算日期之間有多少天。我只需要特殊的日子 – Smiley

回答

1

採取和調整的方法從here

@S   = start date 
@E   = end date, not inclusive 
@full_weeks = floor((@[email protected])/7) 
@days  = (@[email protected]) - @full_weeks*7 OR (@[email protected]) % 7 

SELECT 
    @full_weeks*1 -- saturday 
+IF(@days >= 1 AND weekday(S+0)=5, 1, 0) 
+IF(@days >= 2 AND weekday(S+1)=5, 1, 0) 
+IF(@days >= 3 AND weekday(S+2)=5, 1, 0) 
+IF(@days >= 4 AND weekday(S+3)=5, 1, 0) 
+IF(@days >= 5 AND weekday(S+4)=5, 1, 0) 
+IF(@days >= 6 AND weekday(S+5)=5, 1, 0) 

完成。

Working SQL Fiddle

+0

1. @ full_weeks * 1 - 星期六(這裏是什麼意思?) – Smiley

+0

2.爲什麼它必須...... = 5? – Smiley

+0

我試着開始日期'2013-08-01'和結束日期'2013-08-27',結果是3.如果它計算星期六應該是4,對不對? – Smiley

1

SELECT語句做的另一種方法: -

SELECT DAYNAME(DATE_ADD(@StartDate, INTERVAL (Units.i + Tens.i * 10 + Hundreds.i * 100) DAY)) AS aDayOfWeek, COUNT(*) 
FROM (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS Units 
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS Tens 
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS Hundreds 
WHERE DATE_ADD(@StartDate, INTERVAL (Units.i + Tens.i * 10 + Hundreds.i * 100) DAY) <= @EndDate 
GROUP BY aDayOfWeek 

這將日期高達1000相隔幾天,但易於擴展它日期範圍較大的工作。

它正在做的是生成一系列數字(從0開始),並將它們添加到結果爲< =的開始日期到結束日期。然後獲取每個人的日期名稱並獲得每個人的人數。

+0

它的工作很好,只需要一些調整我的問題......謝謝兄弟=)) – Smiley

0

我認爲使用日曆表更簡單。例如,爲了找出2013年3月份的星期三和星期四,你會做這樣的事情。

select count(*) 
from calendar 
where cal_date between '2013-03-01' and '2013-03-31' 
    and day_of_week in ('Wed', 'Thu') 

count 
-- 
8 

要擴展它以計算星期日,只需將「Sun」添加到IN子句中即可。 (雖然我不得不說這在我看來是一種奇怪的事情。)

select count(*) 
from calendar 
where cal_date between '2013-03-01' and '2013-03-31' 
    and day_of_week in ('Wed', 'Thu', 'Sun') 

count 
-- 
13 

這裏的code for a calendar table in PostgreSQL。您將不得不跳過一些環節來爲MySQL進行翻譯,因爲MySQL不強制執行CHECK約束。

+0

不幸的是我不想使用任何表,只是一個單一的查詢。但它可以做到當你結合這個解決方案http://stackoverflow.com/questions/9295616/how-to-get-list-of-dates-between-two-dates-in-mysql-select-query?lq= 1 ....感謝您的想法:) – Smiley

相關問題