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)
我认为这是解决问题的最佳和最短的解决方案.
nre*_*nre 19
鉴于您已经year和cw(日历周)作为变量(例如,来自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,依此类推,将为您选择一周中的特定日期).看到这里.
日历周的定义我发现所有人都说"从周日开始连续七天".
以下是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)
| 归档时间: |
|
| 查看次数: |
33979 次 |
| 最近记录: |