簡體   English   中英

從MYSQL表中選擇行,其中日期在包含周末的兩列之間

[英]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_dateend_date之間的DATEDIFF大於5,則將有周末。

ADDDATEstart_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.

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