如何将周数转换为日期?

Cep*_*pod 21 mysql sql datetime

鉴于一年和一个日历周,我怎样才能将该周的星期二作为约会?

ind*_*ago 58

在MySQL中,该STR_TO_DATE()功能可以在一行中完成!


例如:我们希望得到的日期Tuesday的中32年度的一周2013.

SELECT STR_TO_DATE('2013 32 Tuesday', '%X %V %W');
Run Code Online (Sandbox Code Playgroud)

输出:

'2013-08-13'
Run Code Online (Sandbox Code Playgroud)

我认为这是解决问题的最佳和最短的解决方案.

  • 我发现这对我很有用:`STR_TO_DATE(CONCAT(YEARWEEK(字段,2),'星期日'),'%X%V%W') (3认同)
  • 这真是伟大的@indago - 正是我所寻找的.比其他解决方案更优雅. (2认同)

nre*_*nre 19

鉴于您已经yearcw(日历周)作为变量(例如,来自SELECT语句),您可以获得如下DATE:

DATE_SUB(
  DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK),
  INTERVAL WEEKDAY(
    DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK)
  ) -1 DAY),
Run Code Online (Sandbox Code Playgroud)

这句话DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK)是重复的; 不想存储变量.SQL-Statement在MySQL上很适合我.

更新:只是为了澄清:WEEKDAY(DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK))将产生一周的第一天.从中提取一个数字(周二为-1;周三为-2,依此类推,将为您选择一周中的特定日期).看到这里.


Eth*_*ffe 9

日历周的定义我发现所有人都说"从周日开始连续七天".

以下是MySQL特定的...您的里程可能会有所不同......

DATE_ADD(MAKEDATE(年,1),INTERVAL cw WEEK)从一年的第一年开始增加不正确的周数......

mysql> select DATE_ADD(MAKEDATE(2011, 1), INTERVAL 1 WEEK);
+----------------------------------------------+
| DATE_ADD(MAKEDATE(2011, 1), INTERVAL 1 WEEK) |
+----------------------------------------------+
| 2011-01-08                                   |
+----------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

根据这个定义,只有1-53的日历周范围才有意义,并且这代表该周的星期日.因此,我们将在今年的第n个星期日增加2天以获得星期二.

以下是今年第一个星期日的日期......

mysql> select date_add('2012-01-01', interval (8 - dayofweek('2011-01-01')) % 7 DAY);
+------------------------------------------------------------------------+
| date_add('2012-01-01', interval (8 - dayofweek('2011-01-01')) % 7 DAY) |
+------------------------------------------------------------------------+
| 2012-01-02                                                             |
+------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

所以这将得到第10个星期日的日期(注意间隔9周,因为我们已经在1)...

mysql> select date_add( date_add('2010-01-01', interval (8 - dayofweek('2010-01-01')) % 7 DAY) , interval 9 week);
+-----------------------------------------------------------------------------------------------------+
| date_add( date_add('2010-01-01', interval (8 - dayofweek('2010-01-01')) % 7 DAY) , interval 9 week) |
+-----------------------------------------------------------------------------------------------------+
| 2010-03-07                                                                                          |
+-----------------------------------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

再加上2天到星期二...

mysql> select date_add( date_add( date_add('2010-01-01', interval (8 - dayofweek('2010-01-01')) % 7 DAY) , interval 9 week), interval 2 day);
+--------------------------------------------------------------------------------------------------------------------------------+
| date_add( date_add( date_add('2010-01-01', interval (8 - dayofweek('2010-01-01')) % 7 DAY) , interval 9 week), interval 2 day) |
+--------------------------------------------------------------------------------------------------------------------------------+
| 2010-03-09                                                                                                                     |
+--------------------------------------------------------------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

或更一般地说:

select 
date_add( 
    date_add( 
        date_add('<year>-01-01', interval (8 - dayofweek('<year>-01-01')) % 7 DAY) 
        , interval <week-1> week)
    , interval <dayOfWeek> day
);
Run Code Online (Sandbox Code Playgroud)