[英]Select rows from MYSQL table where dates between two columns containing weekend
我想從MYSQL表中選擇行,其中兩列之間的日期start_date,end_date包含周末
我試圖找到這個,但沒有幫助
我的表列是名稱開始日期結束日期數量
如果起始日期和結束日期之間的日期包含星期六和星期日,我想打印名稱和金額。
使用DAYNAME函數。 它給出特定日期的Dayname。
嘗試這個,
select * from yourtable where
(DAYNAME(start_date) = 'Saturday' or DAYNAME(start_date) = 'Sunday') and
(DAYNAME(end_date) = 'Saturday' or DAYNAME(end_date) = 'Sunday');
希望它會有所幫助。
PS我沒有運行此查詢。
據我了解,您想將兩列用作開始和結束日期,並計算它們之間的周末天數。 那是對的嗎?
這個答案如何在mysql select查詢中獲取兩個日期之間的日期列表有一些SQL用於獲取范圍內所有日期的列表。
要以此為基礎,您可以將該查詢用作內部聯接,根據開始和結束列僅選擇所需的日期。 然后使用DAYNAME計算周日和周六。
這是一個接近您應使用的示例。 這不完全是您應該使用的! 這僅用於對日期進行硬編碼(並且非常接近於將其作為參數傳遞)。 您應該通過將表加入其中來進行調整! 。 我之所以沒有這樣寫,是因為:我很懶惰,不想創建一個表格來測試和演示它,(更重要的是)我想為您提供幫助,而不僅僅是提供解決方案。
select count(one_date), dayname(one_date) week_day from
(select * from
(select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) one_date from
(select 0 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) t0,
(select 0 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) t1,
(select 0 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) t2,
(select 0 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) t3,
(select 0 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) t4) v ) as all_days
where one_date between '2016-10-01' and '2016-11-15' -- <---- DON'T HARDCODE THESE, JOIN YOUR TABLE TO THE all_days AND FILTER THE DAYS YOU WANT THAT WAY
group by week_day
having week_day in ('Sunday', 'Saturday');
這是一個冗長的查詢,可能會降低性能。 但這可以給你想要的輸出
SELECT x.id,x.name,x.amount FROM
(SELECT name,amount,DATEDIFF(end_date,start_date)+1 AS totDays,
start_date AS day1,ADDDATE(start_date,1) AS day2,
ADDDATE(start_date,2) AS day3,ADDDATE(start_date,3) AS day4,
ADDDATE(start_date,4) AS day5,ADDDATE(start_date,5) AS day6,
end_date FROM your_table)X
WHERE x.totDays>5 OR (WEEKDAY(x.day1)>4 AND x.day1<=x.end_date) OR
(WEEKDAY(x.day2)>4 AND x.day2<=x.end_date) OR
(WEEKDAY(x.day3)>4 AND x.day3<=x.end_date) OR
(WEEKDAY(x.day4)>4 AND x.day4<=x.end_date) OR
(WEEKDAY(x.day5)>4 AND x.day5<=x.end_date) OR
(WEEKDAY(x.day6)>4 AND x.day6<=x.end_date);
或者嘗試一下
SELECT name,amount FROM your_table WHERE
(DATEDIFF(end_date,start_date)+1) >5 OR
(WEEKDAY(start_date)>4 AND start_date<=end_date) OR
(WEEKDAY(ADDDATE(start_date,1))>4 AND ADDDATE(start_date,1)<=end_date) OR
(WEEKDAY(ADDDATE(start_date,2))>4 AND ADDDATE(start_date,2)<=end_date) OR
(WEEKDAY(ADDDATE(start_date,3))>4 AND ADDDATE(start_date,3)<=end_date) OR
(WEEKDAY(ADDDATE(start_date,4))>4 AND ADDDATE(start_date,4)<=end_date) OR
(WEEKDAY(ADDDATE(start_date,5))>4 AND ADDDATE(start_date,5)<=end_date);
筆記:
如果start_date
和end_date
之間的DATEDIFF
大於5,則將有周末。
ADDDATE
與start_date
長達5和比較,與end_date
如果WEEKDAY
輸出大於4,那么就會有周末。
如果要選擇在開始日期和結束日期之間有一個整個周末(星期六和星期日在一起)的行,則可以使用以下查詢:
select name, amount FROM your_table WHERE
datediff(end_date,start_date) > 6
or
(datediff(end_date,start_date)+weekday(start_date)>=6
and weekday(start_date)<>6);
假設整周的start_date和end_date包括在內的datediff(end_date,start_date)等於6,因此,如果天數多於一周,那么我們可以確定之間有一個周末。 如果之間的天數較少,我們必須檢查從給定的開始工作日開始的天數是否可以涵蓋周末,但是我們可以確定,如果開始日期為星期日(從六天后的星期日開始,則為星期六,這兩個周末不是一個接一個的)。
如果您要選擇開始日期和結束日期之間至少有一個工作日(星期六或星期日)的行,則可以使用此查詢
select name, amount FROM your_table WHERE
datediff(end_date,start_date)+weekday(start_date)>=5;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.