如何獲取給定星期的第一天的週數可用?使用周在MySql中獲取本週的第一個星期第
比如我寫這篇文章中,我們是在29周。我想編寫一個MySQL查詢,將使用該WEEKNO 29作爲唯一可用的參數返回週日7月18日。
如何獲取給定星期的第一天的週數可用?使用周在MySql中獲取本週的第一個星期第
比如我寫這篇文章中,我們是在29周。我想編寫一個MySQL查詢,將使用該WEEKNO 29作爲唯一可用的參數返回週日7月18日。
您可以使用:
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。
未經測試(我沒有的MySQL在手):
date_add(
date_sub(curdate(), interval weekday(curdate()) day),
interval ((NUM-weekofyear(curdate()))*7) day)
這是獲得一週的第一天,根據當前日期的周的最後一天的正確方式:
adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate()) DAY) WeekStart,
adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate()) DAY) WeekEnd
我認爲這個解決方案可能受系統區域設置的影響,我用它來代替'adddate(curdate(),INTERVAL -WEEKDAY(curdate())DAY)WeekStart' – 2014-07-31 07:58:55
@SnowBlind,謝謝你的評論。 ...如果有人正在尋找星期五作爲星期的最後一天(即最後一個工作日),那麼試試這個: adddate(curdate(), INTERVAL 4-WEEKDAY(curdate()) DAY) SHOULD_BE_Friday
–
Peter
2015-08-27 19:36:38
最喜歡了這個問題的答案現在這款主板看起來是這樣的其基本形式:
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;
這種方法似乎不上亂七八糟的所有日期一樣好!
難道你不能通過使用2的模式更簡單嗎? YEARWEEK('2011-01-01',2)報告2010年第52周,而模式0則爲2011年第0周。 – user1618143 2013-02-14 17:20:47
如果本週開始爲週日和週末是星期六,用這一個:
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。
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';
的除DCP的回答是:
SELECT STR_TO_DATE('201553 Monday', '%x%v %W')
會給你週一當你一週的開始是星期一。格式說明符必須寫得很小。沒有數學需要。
這可能是最簡單和動態的方式。使用下面的代碼。
SELECT STR_TO_DATE(concat(concat(date_format(CURDATE() , '%Y') , WEEKOFYEAR(CURDATE())) , ' Monday') , '%X%V %W');
它只是工作完美。謝謝 – davykiash 2010-07-23 14:46:36
當使用星期模式3(ISO標準,qv http://stackoverflow.com/questions/11788885/)時,那麼SELECT STR_TO_DATE('201003星期一','%X%V%W')將給出以下星期一週! – ChrisV 2013-02-27 13:24:52
我認爲這是不正確的。嘗試運行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