簡體   English   中英

使用 Week No 在 MySql 中獲取一周的第一天

[英]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' )

幾點:

  • 對 ISO 年和周使用“%x%v %W”
  • 在 ISO 模式的第二個參數上使用 YEARWEEK('your date',3) 和 3(從星期一開始)

使用以下日期進行測試以查找第一個星期一:

  • 2012-12-31 --> 2012-12-31
  • 2014-01-07 --> 2014-01-06

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM