我需要通过使用星期几和时间作为唯一的信息来获取一系列日期。
我知道此操作的反向操作,即使用 WEEKDAY(date) 或 DAYOFWEEK(date),但这不是我需要的。
我有一个表格,看起来像这样,它将被持续扫描并与当前日期进行比较。
+----+---------+----------+----------+
| id | weekday | start | end |
+----+---------+----------+----------+
| 1 | 1 | 09:00:00 | 17:00:00 |
| 2 | 2 | 09:00:00 | 17:00:00 |
| 3 | 3 | 09:00:00 | 17:00:00 |
| 4 | 4 | 23:00:00 | 17:00:00 |
| 5 | 5 | 18:00:00 | 23:00:00 |
| 6 | 6 | 00:00:00 | 00:00:00 |
| 7 | 7 | 00:00:00 | 01:00:00 |
+----+---------+----------+----------+
以上是简单版本,我希望这张表有成百上千次可能的迭代。正如第四排所观察到的,时间也可能超过午夜,我必须补偿。
我需要一个查询,它将为我提供以下结果集,并且在锁定日期时遇到问题,该日期基于当前年份、月份和工作日列中经过的一周中的某一天。
示例结果集:
+---------------------+---------------------+
| start | end |
+---------------------+---------------------+
| 2013-06-24 09:00:00 | 2013-06-24 17:00:00 |
| 2013-06-25 09:00:00 | 2013-06-25 17:00:00 |
| 2013-06-26 09:00:00 | 2013-06-26 17:00:00 |
| 2013-06-27 23:00:00 | 2013-06-28 17:00:00 | # <---- Notice the date difference here
| 2013-06-28 18:00:00 | 2013-06-28 23:00:00 |
| 2013-06-29 00:00:00 | 2013-06-30 00:00:00 | # <---- Also here, the span is 24 hours
| 2013-06-30 00:00:00 | 2013-06-30 01:00:00 |
+---------------------+---------------------+
任何帮助将不胜感激,我已经接近获得当前日期,但是,这给我带来了一些问题,因为这些日期稍后需要转换,所以我需要一个包含所有日期的数组,而不仅仅是当前日期天。
编辑:发布我当前的代码:虽然我不相信这是朝着正确的方向前进
SELECT TIMESTAMP(IF (end < start,
CURRENT_DATE,
SUBDATE(CURRENT_DATE, 1)),
start) AS 'start',
TIMESTAMP(IF (end < start,
CURRENT_DATE,
SUBDATE(CURRENT_DATE, 1))
end) AS 'end',
FROM shift
结果:
+---------------------+---------------------+
| start | end |
+---------------------+---------------------+
| 2013-06-27 23:00:00 | 2013-06-28 17:00:00 |
| 2013-06-28 18:00:00 | 2013-06-28 23:00:00 | # Needs the rest of the dates of the week
+---------------------+---------------------+
第二次编辑
感谢以下评论者的帮助,我得到了以下查询,尽管继续前进,但有些人对设计表示担忧,我将在确定答案之前进行一些测试。如果有更好的方法来完成这项工作,我真的很想听听它!
我想最好的一点是当月份在查询中途改变时,使用星期几来确定差异可能会很麻烦。
询问:
SELECT @diff:=(CAST(weekday AS SIGNED) - (WEEKDAY(CURRENT_DATE) + 1)) as 'diff',
@date:=DATE_ADD(CURRENT_DATE, INTERVAL @diff DAY) as 'start_date',
TIMESTAMP(@date, start) AS 'start',
TIMESTAMP(IF (end <= start,
DATE_ADD(@date, INTERVAL 1 DAY),
@date),
end) AS 'end'
FROM shift
结果:
+------+------------+---------------------+---------------------+
| diff | start_date | start | end |
+------+------------+---------------------+---------------------+
| -4 | 2013-06-24 | 2013-06-24 09:00:00 | 2013-06-24 17:00:00 |
| -3 | 2013-06-25 | 2013-06-25 09:00:00 | 2013-06-25 17:00:00 |
| -2 | 2013-06-26 | 2013-06-26 09:00:00 | 2013-06-26 17:00:00 |
| -1 | 2013-06-27 | 2013-06-27 23:00:00 | 2013-06-28 17:00:00 |
| 0 | 2013-06-28 | 2013-06-28 18:00:00 | 2013-06-28 23:00:00 |
| 1 | 2013-06-29 | 2013-06-29 00:00:00 | 2013-06-30 00:00:00 |
| 2 | 2013-06-30 | 2013-06-30 00:00:00 | 2013-06-30 10:00:00 |
+------+------------+---------------------+---------------------+
第三次编辑
我已经在跨越一个月的开始和结束的时间段测试了上述查询,并发现它适合其目的,我将把上述查询以及一些注释移到答案中,希望有人会发现这很有用未来。
在这方面,我还将包括来自各种评论者的各种陷阱和建议,再次感谢所有花时间提供帮助的人。