繁体   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