1

我需要一个查询来从有 2 列的表中获取结果

Column startdt (datetime), Column 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 是工作日“星期二”的编号)

4

2 回答 2

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
于 2013-07-16T08:56:25.120 回答
0

这个解决方案怎么样:

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

    如果(星期几(o.start_date)= 1、7、星期几(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) <= datediff(o.end_date, o.start_date)

于 2013-10-22T13:16:06.890 回答