SELECT DATE(STR_TO_DATE(CONCAT(CONCAT(YEAR('$uDate1'), week), ' Monday'), '%X%V %W') +
INTERVAL (7 - DAYOFWEEK(STR_TO_DATE(CONCAT(CONCAT(YEAR('$uDate1'), week), ' Monday'),
'%X%V %W'))) DAY)
as week_end_date
此语句的作用是获取我给出的日期 ($uDate1) 并给出该周的周末结束日期 (星期六)。这效果很好,我对此很满意。
我想知道是否有一些我错过的事情可以提高效率,或者即使我错过了一些捷径。
对我有什么建议吗?
<小时/>week >= WEEK('$uDate1') AND week <= WEEK('$uDate2')
这是在我的 WHERE 子句中。所以基本上如果我使用这个...
DATE('$uDate1', INTERVAL 7 - DAYOFWEEK('$uDate1') DAY)
...然后它返回所有记录的同一天。我需要它能够持续几周的时间。
<小时/>我的数据库中有一个名为“week”的列。它只是存储一个对应于一年中的星期的 INT。 (例如本周 21)
然后我有两个日期选择器框。输出获取基于 BETWEEN 和 INCLUDES 所选日期之间的每周的周末日期。
2016年5月10日和2016年5月26日输出2016年5月14日、2016年5月21日、2016年5月28日
导出到 CSV 文件的内容看起来像这样..
WEEK END, LAST NAME, FIRST NAME, ...
5/10/2016, Smith, John, ...
5/26/2016, Jones, James, ...
它会输出本周有工作时间的任何人以及周末结束日期。
旁注:我非常感谢您的评论和帮助。但我不希望任何人为此感到压力!只是好奇是否有更好的方法。 :)
最佳答案
我不知道为什么你当前的 SQL 如此复杂。
你说这只是约会并告诉我该周的周末结束日期(星期六)。
您目前的做法是:-
- 你的这一年即将到来
- 添加一年中的第几周(我认为 - 应该是 WEEK('$uDate1'))
- 将日期添加为字符串(例如今天为2016 21 Monday)
- 将该字符串更改回日期或日期时间值
- 将该日期时间值转换回日期。
- 然后再次计算年份
- 再次添加一年中的第几周
- 获取结果字符串的星期几。由于您已将星期一连接到日期,因此星期几将始终为 2。
- 将得到的星期几从 7 中减去。由于星期几始终为 2,因此结果始终为 5
- 将日期添加为字符串(例如今天为 2016 21 Monday )。
- 然后将该值添加到之前计算的日期中,即星期一日期加上 5 天。
我的建议是只使用:-
DATE_ADD($uDate1, INTERVAL 7 - DAYOFWEEK($uDate1) DAY)
这要简单得多,并且似乎可以满足您的要求。
编辑
查看您的编辑,您需要一个包含 2 个过去日期之间全部或部分星期数的所有星期六的列表。
如果是这样,我认为下面的方法可以做到这一点,并且希望效率更高,因为不需要将日期与字符串相互转换。请注意,它依赖于您的周表来添加日期,因此只能处理最多几周的日期范围。
SELECT DATE_ADD(DATE_ADD('$uDate1', INTERVAL 7 - DAYOFWEEK('$uDate1') DAY), INTERVAL `week` WEEK) AS aDate
FROM `week`
HAVING aDate BETWEEN '$uDate1' AND DATE_ADD('$uDate2', INTERVAL 7 - DAYOFWEEK('$uDate2') DAY)
ORDER BY aDate
关于mysql - 重写mySQL语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37441461/