![](/img/trans.png)
[英]MySQL : first day of the week and last day of the week not working as desired
[英]Getting first day of the week in MySql using Week No
如何獲得周數可用的給定周的第一天?
例如,當我寫這篇文章時,我們在WEEK 29 。我想編寫一個 MySQL 查詢,該查詢將使用這個WEEKNO 29作為唯一可用參數返回7 月 18 日星期日。
這是根據當前日期獲取一周的第一天和一周的最后一天的准確方法:
adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate()) DAY) WeekStart,
adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate()) DAY) WeekEnd
您可以使用:
SELECT STR_TO_DATE('201003 Monday', '%X%V %W');
這將為您提供 2010 年第 3 周的星期一日期,即 2010-01-18。
另一個例子:
SELECT STR_TO_DATE('201052 Sunday', '%X%V %W');
將為您提供 2010 年第 52 周的星期日日期,即 2010-12-26。
最后,使用您的原始示例:
SELECT STR_TO_DATE('201029 Sunday', '%X%V %W');
這給出了 2010-07-18。
到目前為止,該板上最受歡迎的答案的基本形式如下:
SELECT STR_TO_DATE('201003 Monday', '%X%V %W');
這是一個很好的開始答案,但是當您開始將它與 week() 函數結合使用時,它會在某些日子崩潰,除非您添加一些額外的邏輯。
這是同一件事的一個長而凌亂的版本,但似乎在所有日子都有效(順便說一句,當前日期已內置在此 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');
產量 >> '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');
產量 >> '2011-01-02'
綜上所述,我喜歡另一個看起來像這樣的回答
SELECT
adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate()) DAY) WeekStart,
adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate()) DAY) WeekEnd;
這種方法似乎在所有日期都一樣有效,不會造成混亂!
這可能是最簡單和動態的方式。 使用以下代碼。
SELECT STR_TO_DATE( concat( concat( date_format( CURDATE( ) , '%Y' ) , WEEKOFYEAR( CURDATE( ) ) ) , ' Monday' ) , '%X%V %W' );
如果您的一周開始是周日,周末是周六,請使用以下選項:
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 上測試。
dcp 答案的補充:
SELECT STR_TO_DATE('201553 Monday', '%x%v %W')
當您一周的開始是星期一時,會給您星期一。 格式說明符只需寫得很小。 不需要數學。
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';
未經測試(我手頭沒有 MySQL):
date_add(
date_sub(curdate(), interval weekday(curdate()) day),
interval ((NUM-weekofyear(curdate()))*7) day)
用上述解決方案測試。 我最終使用了這個:
STR_TO_DATE( concat( YEARWEEK("2012-12-31", 3) , ' Monday' ) , '%x%v %W' )
幾點:
使用以下日期進行測試以查找第一個星期一:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.