[英]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.