3 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊
給定您year和cw(日歷周)作為變量(例如,從SELECT語(yǔ)句中獲取),您可以通過以下方式獲取DATE:
DATE_SUB(
DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK),
INTERVAL WEEKDAY(
DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK)
) -1 DAY),
該短語(yǔ)DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK)重復(fù);不想存儲(chǔ)變量。SQL語(yǔ)句在MySQL上對(duì)我來(lái)說效果很好。
更新:只是為了澄清:WEEKDAY(DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK))將產(chǎn)生一周的第一天。從中減去一個(gè)數(shù)字(星期二為-1;星期三為-2,依此類推,將為您選擇一周中的特定日期)。

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超17個(gè)贊
在MySQL中,該STR_TO_DATE()函數(shù)僅需一行即可完成操作!
例如:我們希望得到的日期Tuesday的中32日年度的一周2013。
SELECT STR_TO_DATE('2013 32 Tuesday', '%X %V %W');
將輸出:
'2013-08-13'

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊
我發(fā)現(xiàn)日歷周的定義都說“從星期日開始連續(xù)7天。”
以下是MySQL特有的...您的里程可能會(huì)有所不同...
DATE_ADD(MAKEDATE(year,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 |
+----------------------------------------------+
根據(jù)此定義,只有日歷周的范圍為1到53,并代表該周的星期日才有意義。因此,我們將在今年的第n個(gè)星期日增加2天以得到星期二。
以下獲取一年中第一個(gè)星期日的日期...
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 |
+------------------------------------------------------------------------+
因此,它將獲得第10個(gè)星期日的日期(注意間隔9周,因?yàn)槲覀円呀?jīng)是1點(diǎn)了)...
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 |
+-----------------------------------------------------------------------------------------------------+
再增加2天才能到達(dá)星期二...
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 |
+--------------------------------------------------------------------------------------------------------------------------------+
或更一般而言:
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
);
添加回答
舉報(bào)