MySQL 查询结果与 2 个日期之间的工作日
Posted
技术标签:
【中文标题】MySQL 查询结果与 2 个日期之间的工作日【英文标题】:MySQL query results with weekday between 2 dates 【发布时间】:2013-07-15 09:22:57 【问题描述】:我需要一个查询来从一个有 2 列的表中获取结果
列 startdt(日期时间),列 enddt(日期时间) 有一些记录 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 是工作日“星期二”的编号)
【问题讨论】:
你看过 mysql 的DAYNAME()
、DAYOFWEEK()
和 WEEKDAY()
函数吗?
我已经查看了 weekday() 函数如果你执行这个查询 SELECT ArticleID,startdt,enddt,weekday(startdt) as weekt,weekday(enddt) as weeknd FROM events 示例:我想要记录喜欢工作日 3,也就是星期四
所以添加一个过滤器:例如... WHERE WEEKDAY(column) = 3
我无法添加该过滤器,因为如果我的开始日期为 2013 年 7 月 15 日,结束日期为 2013 年 7 月 25 日,则 3 介于 2 个日期之间,开始日期的工作日为 0,结束日期为是 3 如果我想搜索 2 将没有结果。我想获取所有将在工作日星期四活动的事件
我已经编辑了这个问题,所以你可以理解我想要做什么。
【参考方案1】:
如何使用其他人给你的 cmets 并使用结合了 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
【讨论】:
我已经这样做了,结果不是我想要的。你可以在这里查看sqlfiddle.com/#!2/a80ce/38我选择了星期二的 3,结果应该是 ID 1、2、3、4、6 而不仅仅是 ID 6,因为星期二在除 ID 5 之外的所有日期之间 我很困惑,您是否希望所有事件在用户选择的日期都处于活动状态,或者您是否希望所有事件在用户选择的一周中的某一天处于活动状态。假设用户选择 7 月 23 日,星期二,他应该看到什么事件? 我想要周二(仅周二)活动的所有活动,而不是具体日期。我提出了这个查询sqlfiddle.com/#!2/a80ce/51,我认为没问题。我使用 DATEDIFF 来计算 2 个日期之间的差异,如果差异 >= 6,那么将显示记录。 只是不......这是一个非常糟糕和有缺陷的想法。将 '('2013-02-01 00:00:00','2013-05-01 00:00:00')' 添加到您的架构中,您的查询也会选择它。您必须使用dayofmonth
和dayofweek
的组合。我想再次强调,您的问题仍然不清楚,“仅在星期二”的“活动”是什么意思,因为您的查询还选择了历史事件。
我刚刚添加了新记录,结果还可以。 sqlfiddle.com/#!2/c19e2/1 我只想检查星期二或另一天是否是活动活跃的日子之一。如果事件在 2013 年 7 月 15 日星期一至 2013 年 7 月 19 日星期五期间处于活动状态,并且用户单击星期二,那么他将看到此事件,因为星期二介于星期一和星期五之间。之后我将使用此查询来获取特色事件或过去的事件。就像我想参加一个活动,我只能在周五去那里,我想查看周五将进行的所有活动。【参考方案2】:
这个解决方案怎么样:
首先您将星期几转换为 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)
【讨论】:
以上是关于MySQL 查询结果与 2 个日期之间的工作日的主要内容,如果未能解决你的问题,请参考以下文章
mysql“日期之间”查询在 phpmyadmin 中有效,但 PDO 不返回任何内容
在MYSQL里,如何计算两个日期间的时间差,并已年月形式显示。