【问题标题】:How do I get the first day of the week of a date in mysql?如何在mysql中获取日期的一周的第一天?
【发布时间】:2011-10-20 02:51:28
【问题描述】:

假设我有 2011-01-03,我想获得一周的第一天,即星期日,即 2011-01-02,我该怎么做?

原因是我有这个查询:

select 
  YEAR(date_entered) as year, 
  date(date_entered) as week,   <-------This is what I want to change to select the first day of the week.
  SUM(1) as total_ncrs, 
  SUM(case when orgin = picked_up_at then 1 else 0 end) as ncrs_caught_at_station 
from sugarcrm2.ncr_ncr 
where 
sugarcrm2.ncr_ncr.date_entered > date('2011-01-01') 
and orgin in( 
'Silkscreen', 
'Brake', 
'Assembly', 
'Welding', 
'Machining', 
'2000W Laser', 
'Paint Booth 1', 
'Paint Prep', 
'Packaging', 
'PEM', 
'Deburr', 
'Laser ', 
'Paint Booth 2', 
'Toolpath' 
) 
and date_entered is not null 
and orgin is not null 
AND(grading = 'Minor' or grading = 'Major') 
 and week(date_entered) > week(current_timestamp) -20 
group by year, week(date_entered) 
order by year   asc, week asc 

是的,我意识到 origin 拼写错误,但它在我之前就在这里,所以我无法更正它,因为太多内部应用程序引用它。

所以,我按周分组,但我希望它填充我的图表,所以我不能让所有周的开始看起来像不同的日期。我该如何解决这个问题?

【问题讨论】:

    标签: mysql date select time


    【解决方案1】:

    如果一周从星期日开始,请执行以下操作:

    DATE_ADD(mydate, INTERVAL(1-DAYOFWEEK(mydate)) DAY)
    

    如果一周从星期一开始,请执行以下操作:

    DATE_ADD(mydate, INTERVAL(-WEEKDAY(mydate)) DAY);
    

    more info

    【讨论】:

    • 从周日开始,在加拿大,在这栋大楼里。
    • 是的,但我们是加拿大的一家公司,工资期从周日开始,这是一份内部报告,用于对员工的工资期进行排名,所以欧洲的第一天是周一是多余的。然而,这是非常酷的琐事!
    • 此外,英国也将星期日视为一周的第一天,因此并非整个欧洲都如此。
    • 不,它没有。我在英国,本周从Monday 开始:)
    • 老实说,我只是在谷歌上搜索了一下。但这很酷。但我的解决方案是在加拿大为加拿大
    【解决方案2】:

    如果您需要处理从星期一开始的周,您也可以这样做。先定义一个自定义的FIRST_DAY_OF_WEEK函数:

    DELIMITER ;;
    CREATE FUNCTION FIRST_DAY_OF_WEEK(day DATE)
    RETURNS DATE DETERMINISTIC
    BEGIN
      RETURN SUBDATE(day, WEEKDAY(day));
    END;;
    DELIMITER ;
    

    然后你可以这样做:

    SELECT FIRST_DAY_OF_WEEK('2011-01-03');
    

    供您参考,MySQL 提供了两种不同的函数来检索一周的第一天。有DAYOFWEEK

    返回日期的工作日索引(1 = 星期日,2 = 星期一,...,7 = 星期六)。这些索引值对应于 ODBC 标准。

    还有WEEKDAY:

    返回日期的工作日索引(0 = 星期一,1 = 星期二,... 6 = 星期日)。

    【讨论】:

    • 这几乎对我有用。我想知道星期天的日期,因为那是我这一周的第一天。因此,如果我通过“2017-06-24”(星期六),FIRST_DAY_OF_WEEK 将返回“2017-06-19”(星期一)。如何让它返回“2017-06-18”(星期日)?
    • @JasonAyer 如果你还没有让它工作,你可以在函数内部做RETURN SUBDATE(day, DAYOFWEEK(day) - 1);
    【解决方案3】:

    如果一周从星期一开始

      SELECT SUBDATE(mydate, weekday(mydate));
    

    如果星期从星期日开始

      SELECT SUBDATE(mydate, dayofweek(mydate) - 1);
    

    示例:

    SELECT SUBDATE('2018-04-11', weekday('2018-04-11'));
    

    2018-04-09

    SELECT SUBDATE('2018-04-11', dayofweek('2018-04-11') - 1);
    

    2018-04-08

    【讨论】:

      【解决方案4】:

      星期从星期天开始,然后得到星期的第一个日期和星期的最后一个日期

      SELECT  
        DATE("2019-03-31" + INTERVAL (1 - DAYOFWEEK("2019-03-31")) DAY) as start_date,  
        DATE("2019-03-31" + INTERVAL (7 - DAYOFWEEK("2019-03-31")) DAY) as end_date
      

      一周从星期一开始,然后得到一周的第一个日期和一周的最后一个日期

      SELECT  
        DATE("2019-03-31" + INTERVAL ( - WEEKDAY("2019-03-31")) DAY) as start_date, 
        DATE("2019-03-31" + INTERVAL (6 - WEEKDAY("2019-03-31")) DAY) as end_date
      

      【讨论】:

        【解决方案5】:
        select '2011-01-03' - INTERVAL (WEEKDAY('2011-01-03')+1) DAY; 
        

        返回一周中第一天的日期。你可以研究一下。

        【讨论】:

          【解决方案6】:

          这比编写函数来确定一周的第一天要简单得多。

          一些变体例如
          SELECT DATE_ADD((SELECT CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1)DAY),INTERVAL 7 DAY)(用于查询的结束日期,例如在“开始日期”和“结束日期”之间)。
          SELECT CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1) DAY(用于查询的开始日期)。

          这将返回当前一周的所有值。示例查询如下:
          SELECT b.foo FROM bar b
          WHERE b.datefield BETWEEN
          (SELECT CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1) DAY)
          AND
          (SELECT DATE_ADD((SELECT CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1)DAY),INTERVAL 7 DAY))

          【讨论】:

            【解决方案7】:

            这对我有用

            只需确保以下查询中的两个日期相同...

            SELECT ('2017-10-07' - INTERVAL WEEKDAY('2017-10-07') Day) As `mondaythisweek`
            

            此查询返回:2017-10-02 这是一个星期一,

            但如果你的第一天是星期天,那么只需从这个结果中减去一天就可以了!

            【讨论】:

              【解决方案8】:

              如果一周从星期一开始,请执行以下操作:

              DATE_SUB(mydate, INTERVAL WEEKDAY(mydate) DAY)
              

              【讨论】:

                【解决方案9】:
                  SELECT MIN(DATE*given_date*) FROM *table_name*
                

                这将在任何给定日期的一周开始时返回。

                继续努力!

                【讨论】:

                  猜你喜欢
                  • 2017-02-24
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-11-22
                  • 1970-01-01
                  • 2011-05-08
                  • 1970-01-01
                  相关资源
                  最近更新 更多