MySQL查询结果,工作日在2个日期之间

时间:2013-07-15 09:22:57

标签: mysql date

我需要一个查询来从具有2列

的表中获取结果

列startdt(datetime),列enddt(datetime) 有一些记录与startdt 2013-07-19和enddt 2013-07-29

我需要在工作日= 1(星期二)获取记录 日期2013-07-19的记录是工作日4,结束日期为2013-07-29,即0

实际上我想得到工作日星期一或工作日的结果。

您可以查看上面的链接以获取示例 http://sqlfiddle.com/#!2/a80ce/1

如果你不明白我想做什么让我解释一下。我的活动从7月15日开始到7月25日结束。(周一开始,周四结束)用户选择其中一个工作日(周一,周二等)。如果他选择星期二,那么我想要查询将获得星期二活动的所有事件。

我已经找到了答案,所以如果有人想检查它

SELECT articleid,startdt,enddt,dayofweek(startdt), DATEDIFF(enddt,startdt) datedf 
FROM events 
WHERE (dayofweek(events.startdt) <= 3 AND dayofweek(events.enddt) >= 3)
OR DATEDIFF(enddt,startdt) >=6

(3是工作日“星期二”的数字)

2 个答案:

答案 0 :(得分:1)

如何使用其他人提供的评论并使用结合dayofweek和简单的更大/更小/相等语法的查询,如下所示:

SELECT * FROM events where dayofweek(events.startdt) <= 6 AND dayofweek(events.enddt) >= 6

如果用户指定了星期五(= 6),则会给出以下结果:

ARTICLEID   STARTDT     ENDDT
4   July, 12 2013 00:00:00+0000     July, 26 2013 00:00:00+0000
6   July, 16 2013 00:00:00+0000     July, 20 2013 00:00:00+0000

我确实认为你最好使用dayofmonth,因为这(可能只是对我来说)使它更清晰,可能结合使用两者来确保它在星期五活跃。

OP表示还应检索历史记录中的事件,因此以下查询可以执行他想要的操作:

SELECT * FROM events where dayofweek(events.startdt) <= 6 AND dayofweek(events.enddt) >= 6 OR DATEDIFF(enddt,startdt) >=6

答案 1 :(得分:0)

这个解决方案怎么样:

  • 首先你转换星期几的格式是6是星期六,7是星期日(对我来说更容易)

    if(dayofweek(o.start_date)= 1,7,dayofweek(o.start_date)-1)

  • 之后你计算了从工作日到达某些工作日所需的start_date的日期

    (7 - if(dayofweek(o.start_date)= 1,7,dayofweek(o.start_date)-1)

  • 最后确保两个日期之间的天数差异不小于上述计算

    (7 - if(dayofweek(o.start_date)= 1,7,dayofweek(o.start_date)-1)&lt; = datediff(o.end_date,o.start_date)