[英]MySQL : first day of the week and last day of the week not working as desired
[英]Getting first day of the week in MySql using Week No
如何获得周数可用的给定周的第一天?
例如,当我写这篇文章时,我们在WEEK 29 。我想编写一个 MySQL 查询,该查询将使用这个WEEKNO 29作为唯一可用参数返回7 月 18 日星期日。
这是根据当前日期获取一周的第一天和一周的最后一天的准确方法:
adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate()) DAY) WeekStart,
adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate()) DAY) WeekEnd
您可以使用:
SELECT STR_TO_DATE('201003 Monday', '%X%V %W');
这将为您提供 2010 年第 3 周的星期一日期,即 2010-01-18。
另一个例子:
SELECT STR_TO_DATE('201052 Sunday', '%X%V %W');
将为您提供 2010 年第 52 周的星期日日期,即 2010-12-26。
最后,使用您的原始示例:
SELECT STR_TO_DATE('201029 Sunday', '%X%V %W');
这给出了 2010-07-18。
到目前为止,该板上最受欢迎的答案的基本形式如下:
SELECT STR_TO_DATE('201003 Monday', '%X%V %W');
这是一个很好的开始答案,但是当您开始将它与 week() 函数结合使用时,它会在某些日子崩溃,除非您添加一些额外的逻辑。
这是同一件事的一个长而凌乱的版本,但似乎在所有日子都有效(顺便说一句,当前日期已内置在此 asnwer 中):
SELECT STR_TO_DATE(
(IF( CAST(WEEK(NOW(),0) AS UNSIGNED) = 0,
(CONCAT(
CAST((CAST(YEAR(NOW()) AS UNSIGNED) - 1) AS CHAR),
'52 Sunday')),
(CONCAT(
CAST(YEAR(NOW()) AS CHAR),
IF( CAST(WEEK(NOW(),0) AS UNSIGNED) < 10,'0','' ),
CAST(WEEK(NOW(),0) AS CHAR),
' Sunday')))),
'%X%V %W');
这个混乱处理了当一年在一周中的某些日子滚动时出现的问题。 例如,2011 年从星期六开始,所以开始这一周的星期日是上一年。 这是带有硬编码示例的选择:
SELECT STR_TO_DATE(
(IF( CAST(WEEK('2011-01-01',0) AS UNSIGNED) = 0,
(CONCAT(
CAST((CAST(YEAR('2011-01-01') AS UNSIGNED) - 1) AS CHAR),
'52 Sunday')),
(CONCAT(
CAST(YEAR('2011-01-01') AS CHAR),
IF( CAST(WEEK('2011-01-01',0) AS UNSIGNED) < 10,'0','' ),
CAST(WEEK('2011-01-01',0) AS CHAR),
' Sunday')))),
'%X%V %W');
产量 >> '2010-12-26'
SELECT STR_TO_DATE(
(IF( CAST(WEEK('2011-01-02',0) AS UNSIGNED) = 0,
(CONCAT(
CAST((CAST(YEAR('2011-01-02') AS UNSIGNED) - 1) AS CHAR),
'52 Sunday')),
(CONCAT(
CAST(YEAR('2011-01-02') AS CHAR),
IF( CAST(WEEK('2011-01-02',0) AS UNSIGNED) < 10,'0','' ),
CAST(WEEK('2011-01-02',0) AS CHAR),
' Sunday')))),
'%X%V %W');
产量 >> '2011-01-02'
综上所述,我喜欢另一个看起来像这样的回答
SELECT
adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate()) DAY) WeekStart,
adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate()) DAY) WeekEnd;
这种方法似乎在所有日期都一样有效,不会造成混乱!
这可能是最简单和动态的方式。 使用以下代码。
SELECT STR_TO_DATE( concat( concat( date_format( CURDATE( ) , '%Y' ) , WEEKOFYEAR( CURDATE( ) ) ) , ' Monday' ) , '%X%V %W' );
如果您的一周开始是周日,周末是周六,请使用以下选项:
SELECT
DATE_ADD(CURDATE(), INTERVAL (MOD(DAYOFWEEK(CURDATE())-1, 7)*-1) DAY) AS week_start,
DATE_ADD(CURDATE(), INTERVAL ((MOD(DAYOFWEEK(CURDATE())-1, 7)*-1)+6) DAY) AS week_end
在 MySQL 上测试。
dcp 答案的补充:
SELECT STR_TO_DATE('201553 Monday', '%x%v %W')
当您一周的开始是星期一时,会给您星期一。 格式说明符只需写得很小。 不需要数学。
SELECT CONCAT(RIGHT(STR_TO_DATE(CONCAT(YEARWEEK(NOW()),'Monday'), '%X%V %W'),2),'-',
MID(STR_TO_DATE(CONCAT(YEARWEEK(NOW()),'Monday'), '%X%V %W'),6,2),'-',
LEFT(STR_TO_DATE(CONCAT(YEARWEEK(NOW()),'Monday'), '%X%V %W'),4)) AS 'Lundi',
CONCAT(RIGHT(STR_TO_DATE(CONCAT(YEAR(NOW()), week(now(),3),'Sunday'), '%X%V %W'),2),'-',
MID(STR_TO_DATE(CONCAT(YEAR(NOW()), week(now(),3),'Sunday'), '%X%V %W'),6,2),'-',
LEFT(STR_TO_DATE(CONCAT(YEAR(NOW()), week(now(),3),'Sunday'), '%X%V %W'),4)) AS 'Dimanche';
未经测试(我手头没有 MySQL):
date_add(
date_sub(curdate(), interval weekday(curdate()) day),
interval ((NUM-weekofyear(curdate()))*7) day)
用上述解决方案测试。 我最终使用了这个:
STR_TO_DATE( concat( YEARWEEK("2012-12-31", 3) , ' Monday' ) , '%x%v %W' )
几点:
使用以下日期进行测试以查找第一个星期一:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.