2011-08-16 61 views

回答

17

鑑於你有yearcw(砑光周)爲變量(例如SELECT語句),您可以獲取日期如下:

DATE_SUB(
    DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK), 
    INTERVAL WEEKDAY(
    DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK) 
) -1 DAY), 

短語DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK)是duplica泰德;不想存儲變量。 SQL語句在MySQL上對我很好。

更新:只是爲了澄清:WEEKDAY(DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK))將產生一週的第一天。從中減去一個數字(星期二爲-1;星期三爲-2等)將爲您選擇一週中的特定日期。 見here

+0

有不同的標準,「SQL?週數!美國系統(Jan1 = week1周)可能與ISO系統不同(每年的第一個星期四=第1周)。因此,請確保根據您預定的一週內定義進行測試。 – Eljakim

+0

@Eljakim,這是正確的,實際上是爲什麼「一週一次」的算術能力在某種程度上得不到MySQL的支持。最好不要使用它們。事實上,從「每週的一週」遷移是我爲什麼寫這個查詢一次的原因。 – nre

+0

不要爲此使用MAKEDATE,它會構造錯誤的日期,尤其是當您使用商業日期和日曆週數時。例如'MAKEDATE(2017,1)'會給你'Sun,2017年1月1日',*這實際上是2016年的第52周*,2017年的第一週從1月2日開始。相反,使用'STR_TO_DATE('2017 1 Monday','%x%v%W')'來得到正確星期的'Monday'產生'Mon,2017年1月2日' –

0

這裏是一個樣本,這可能有助於:

SET DATEFIRST 1 
declare @wk int set @wk = 33 
declare @yr int set @yr = 2011 

select dateadd (week, @wk, dateadd (year, @yr-1900, 0)) - 2 - 
    datepart(dw, dateadd (week, @wk, dateadd (year, @yr-1900, 0)) - 4) as date 

,其結果是:

2011-08-16 00:00:00.000 

今天(星期二)是。

0

我認爲使用php編寫函數的邏輯會更容易。

如果您使用的是PHP腳本,您可以將所有日期的格式設置爲「日 - 月 - 年」,並使用循環遍歷每日(從20世紀80年代到2038年或從您的mysql日期列中)。

http://www.php.net/manual/en/function.date-format.php

然後使用日期格式的日期,在該循環將它們轉換爲星期幾。

以下是可以在日期格式中使用的東西的列表。 http://www.php.net/manual/en/function.date.php D N l w 所有幫助你與星期幾。

9

日曆周的定義我發現所有的說「從週日開始連續七天的時期」。

以下是MySQL的具體...您的里程可能會有所不同...

DATE_ADD(MAKEDATE(年,1),間隔CW WEEK)從是不正確的一年中增加了1周。 ...

mysql> select DATE_ADD(MAKEDATE(2011, 1), INTERVAL 1 WEEK); 
+----------------------------------------------+ 
| DATE_ADD(MAKEDATE(2011, 1), INTERVAL 1 WEEK) | 
+----------------------------------------------+ 
| 2011-01-08         | 
+----------------------------------------------+ 

通過這個定義,它只是有意義的讓日曆周範圍從1-53,並且這代表該周的星期日。因此,我們將在今年的第十個週日增加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                | 
+------------------------------------------------------------------------+ 

所以這將讓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                       | 
+-----------------------------------------------------------------------------------------------------+ 

加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                              | 
+--------------------------------------------------------------------------------------------------------------------------------+ 

或者更一般地:

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 
); 
50

在MySQL中,STR_TO_DATE()函數只需一行即可完成! 例子中,我們想要得到的32 週二的日日的一年周2013年

SELECT STR_TO_DATE('201332 Tuesday', '%X%V %W'); 

將輸出:

'2013-08-13' 

我認爲這是最好的和最短的解決方案你的問題。

+2

這真是太棒了@indago - 正是我正在尋找。比其他解決方案更優雅。 – Voodoo

+1

非常優雅!當爲STR_TO_DATE()構造YYYYCW字符串時,你可以使用這個'... STR_TO_DATE(CONCAT(YEAR(field),LPAD(WEEKOFYEAR(field,2,'0'))..' –

+0

@AlBundy你可以使用它從當前日期或特定字段中提取,如上所示,只需用'date_field'替換'CURDATE()'就像這樣 'SELECT STR_TO_DATE(CONCAT(YEAR(CURDATE()),LPAD(WEEKOFYEAR CURDATE()),2,'0'),'',DAYNAME(CURDATE())),'%X%V%W');' – indago

0

鑑於解決方案沒有考慮,一年的第一週可能會在十二月底開始。因此,我們必須檢查,如果1月1日屬於calendarweek舊的或新的一年裏:

SET @week=1; 
SET @year=2014; 
SET @x_weeks_after_new_year=DATE_ADD(MAKEDATE(@year, 1), INTERVAL (SELECT IF(WEEKOFYEAR(MAKEDATE(@year, 1))>50 , 0 , -1))[email protected] WEEK); 
SELECT 
    CONCAT(@year, '-', @week) WeekOfYear, 
    @weekStart:=DATE_SUB(@x_weeks_after_new_year, INTERVAL WEEKDAY(@x_weeks_after_new_year) DAY) Monday, 
    DATE_ADD(@weekStart, INTERVAL 6 DAY) Sunday 

這將導致:

+------------+------------+------------+ 
| WeekOfYear | Monday | Sunday | 
+------------+------------+------------+ 
| 2014-1 | 2013-12-30 | 2014-01-05 | 
+------------+------------+------------+ 
0

在看着indago答案,然後做一些測試,我作爲結果正在接下來的一週。

我做了一個小調整,然後匹配日期。

STR_TO_DATE( '#{year_week}星期一', '%X%V%W') - 本週初

STR_TO_DATE( '#{year_week}星期天', '%X%V%W') - 周結束

您可以比較的結果在這裏http://www.epochconverter.com/date-and-time/weeknumbers-by-year.php?year=2015

-1

的upvoted解決方案在2014年和2015年爲我工作,但對我來說,2016年沒有工作(可能是因爲新年的開始是在週一和不是在星期天

我用下面的函數來解決這個問題:

STR_TO_DATE( CONCAT(MOD(day_nr + 1,7), '/',week_nr, '/',年), '%W /%U /%Y')

在我的數據: day_nr = 0 - >週一,

day_nr = 6 - >週日

所以我不得不修復與MOD功能

相關問題