【问题标题】:MySQL DAYOFWEEK() - my week begins with mondayMySQL DAYOFWEEK() - 我的一周从星期一开始
【发布时间】:2009-07-29 20:43:08
【问题描述】:

我在 MySQL 中使用 DAYOFWEEK() 函数,它为 sunday 返回 1。但在我的国家,一周从星期一开始,而不是星期日。是否有机会从 MySQL 获取 dayofweek 格式如下:(1 - Monday, 2 - Tuesday, ...) ?

【问题讨论】:

  • 我知道它可以在一些恶劣的条件下完成。我什至尝试了在我看来不起作用的模数方法(因为 MySQL 中奇怪的模数实现)。到目前为止,没有什么对我有用。
  • 这是一个 mysql 错误。根据 ISO 标准,周从星期一开始。 en.wikipedia.org/wiki/ISO_week_date
  • 这不是错误。 DAYOFWEEK() 使用 ODBC 标准。
  • 虽然我同意@rgtk 这不是一个“错误”,但我会说 ISO 应该取代 ODBC。

标签: mysql


【解决方案1】:

使用WEEKDAY() 而不是DAYOFWEEK(),它从星期一开始。

如果您需要从索引 1 开始,请使用或WEEKDAY() + 1

【讨论】:

  • 有时我只是个笨蛋。我可以弄清楚,MySQL 本身就支持这种功能。谢谢你。
  • 笨的不是你。为什么 weekday 会返回与 dayofweek 不同的值?这是 mySQL 的一个愚蠢的想法。
【解决方案2】:

减一换周日怎么样

IF(DAYOFWEEK() = 1, 7, DAYOFWEEK() - 1)

当然,您必须对每个查询都执行此操作。

【讨论】:

  • 1=星期日是 ODBC 标准,所以我认为它必须在查询中。
【解决方案3】:

尝试使用WEEKDAY()函数。

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

【讨论】:

    【解决方案4】:

    您可以轻松使用 MODE 参数:

    MySQL :: MySQL 5.5 Reference Manual :: 12.7 Date and Time Functions

    如果省略 mode 参数,则使用 default_week_format 系统变量的值:

    MySQL :: MySQL 5.1 Reference Manual :: 5.1.4 Server System Variables

    【讨论】:

    • 我认为这实际上是最好的答案。
    【解决方案5】:

    可以写一个 udf 并取一个值来告诉它一周中的哪一天应该是 1 看起来像这样 (借鉴 John 的回答,使用 MOD 而不是 CASE)

    DROP FUNCTION IF EXISTS `reporting`.`udfDayOfWeek`;
    DELIMITER |
    CREATE FUNCTION `reporting`.`udfDayOfWeek` (
      _date DATETIME,
      _firstDay TINYINT
    ) RETURNS tinyint(4)
    FUNCTION_BLOCK: BEGIN
      DECLARE _dayOfWeek, _offset TINYINT;
      SET _offset = 8 - _firstDay;
      SET _dayOfWeek = (DAYOFWEEK(_date) + _offset) MOD 7;
      IF _dayOfWeek = 0 THEN
        SET _dayOfWeek = 7;
      END IF;
      RETURN _dayOfWeek;
    END FUNCTION_BLOCK
    

    例如,要调用此函数以在您的一周从星期二开始时为您提供当前星期几的值,您可以调用:

    SELECT udfDayOfWeek(NOW(), 3);
    

    将它作为 udf 的好处是您也可以在这样的结果集字段上调用它:

    SELECT
      udfDayOfWeek(p.SignupDate, 3) AS SignupDayOfWeek,
      p.FirstName,
      p.LastName
    FROM Profile p;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-14
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2013-09-23
      相关资源
      最近更新 更多