我需要一个查询来从具有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是工作日“星期二”的数字)
答案 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)