繁体   English   中英

使用 Week No 在 MySql 中获取一周的第一天

[英]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' )

几点:

  • 对 ISO 年和周使用“%x%v %W”
  • 在 ISO 模式的第二个参数上使用 YEARWEEK('your date',3) 和 3(从星期一开始)

使用以下日期进行测试以查找第一个星期一:

  • 2012-12-31 --> 2012-12-31
  • 2014-01-07 --> 2014-01-06

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM