2010-07-23 67 views

回答

41

您可以使用:

SELECT STR_TO_DATE('201003 Monday', '%X%V %W'); 

這會給你個星期的星期一日期2010年3,這將是2010-01-18。

又如:

SELECT STR_TO_DATE('201052 Sunday', '%X%V %W'); 

會給你52周的週日日期2010年,這將是2010-12-26。

最後,用你原來的例子:

SELECT STR_TO_DATE('201029 Sunday', '%X%V %W'); 

這給2010-07-18。

+0

它只是工作完美。謝謝 – davykiash 2010-07-23 14:46:36

+3

當使用星期模式3(ISO標準,qv http://stackoverflow.com/questions/11788885/)時,那麼SELECT STR_TO_DATE('201003星期一','%X%V%W')將給出以下星期一週! – ChrisV 2013-02-27 13:24:52

+1

我認爲這是不正確的。嘗試運行SELECT STR_TO_DATE('201402 Sunday','%X%V%W'),STR_TO_DATE('201402 Monday','%X%V%W') - 你會發現它不是第2周的星期日和第二週的星期一 - 這是第二個星期天和第二星期一的年份 – 1nstinct 2014-12-29 14:29:53

0

未經測試(我沒有的MySQL在手):

date_add(
    date_sub(curdate(), interval weekday(curdate()) day), 
    interval ((NUM-weekofyear(curdate()))*7) day) 
47

這是獲得一週的第一天,根據當前日期的周的最後一天的正確方式:

adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate()) DAY) WeekStart, 
adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate()) DAY) WeekEnd 
+9

我認爲這個解決方案可能受系統區域設置的影響,我用它來代替'adddate(curdate(),INTERVAL -WEEKDAY(curdate())DAY)WeekStart' – 2014-07-31 07:58:55

+1

@SnowBlind,謝謝你的評論。 ...如果有人正在尋找星期五作爲星期的最後一天(即最後一個工作日),那麼試試這個: adddate(curdate(), INTERVAL 4-WEEKDAY(curdate()) DAY) SHOULD_BE_Friday Peter 2015-08-27 19:36:38

4

最喜歡了這個問題的答案現在這款主板看起來是這樣的其基本形式:

SELECT STR_TO_DATE('201003 Monday', '%X%V %W'); 

這是一個很好的答案開始,但是當你開始把它放在一起選擇使用同一周()函數,除非你添加一些額外的邏輯,打破了一些日子。

這裏是同樣的事情很長,凌亂的版本,但它似乎對所有天(BTW當前日期被內置到這個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'); 

YEILDS >> '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'); 

YEILDS >> '2011-01-02'

所有這一切說,我喜歡的其他asnwer貼,看起來像這樣

SELECT 
adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate()) DAY) WeekStart, 
adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate()) DAY) WeekEnd; 

這種方法似乎不上亂七八糟的所有日期一樣好!

+1

難道你不能通過使用2的模式更簡單嗎? YEARWEEK('2011-01-01',2)報告2010年第52周,而模式0則爲2011年第0周。 – user1618143 2013-02-14 17:20:47

2

如果本週開始爲週日和週末是星期六,用這一個:

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。

0
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'; 
0

的除DCP的回答是:

SELECT STR_TO_DATE('201553 Monday', '%x%v %W') 

會給你週一當你一週的開始是星期一。格式說明符必須寫得很小。沒有數學需要。

3

這可能是最簡單和動態的方式。使用下面的代碼。

SELECT STR_TO_DATE(concat(concat(date_format(CURDATE() , '%Y') , WEEKOFYEAR(CURDATE())) , ' Monday') , '%X%V %W'); 
相關問題