从MYSQL表中选择包含周末的两列之间的日期

时间:2016-10-06 13:58:20

标签: php mysql

我想从MYSQL表中选择行,其中两列之间的日期为start_date,end_date包含周末

我尝试找到this,但没有帮助

我的表格列名为name start_date end_date amount

如果start_date和end_date之间的天数包含星期六和星期日,我想打印姓名和金额。

4 个答案:

答案 0 :(得分:1)

使用DAYNAME功能。它给出了特定日期的日期名称。

试试这个,

xdebug.remote_enable = On
xdebug.remote_autostart=1

希望它会有所帮助。

P.S。我不会运行这个查询。

答案 1 :(得分:0)

根据我的理解,您希望将两列作为开始日期和结束日期,并计算它们之间的周末天数。这是对的吗?

这个答案How to get list of dates between two dates in mysql select query有一些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');

答案 2 :(得分:0)

这是一个冗长的查询,可能会降低性能。但这可以为您提供所需的输出

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);

备注:

如果DATEDIFFstart_date之间的end_date大于5,则会有周末。

<{> ADDDATE start_date最多为5,并将其与end_date进行比较,如果输出的WEEKDAY大于4,则会有周末。

答案 3 :(得分:0)

如果您想选择开始日期和结束日期之间的行,那么整个周末(周六和周日)可以使用此查询:

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;