【问题标题】:What mode for MySQL WEEK() complies with ISO 8601MySQL WEEK() 的什么模式符合 ISO 8601
【发布时间】:2012-08-01 02:22:01
【问题描述】:

MySQL 的WEEK() 函数在什么模式下产生ISO 8601 week of the yearWEEK() 的参数 2 根据此图表设置模式:

+--------------------------------------------------------------------+
| Mode | First day of week | Range | Week 1 is the first week ...    |
|------+-------------------+-------+---------------------------------|
| 0    | Sunday            | 0-53  | with a Sunday in this year      |
|------+-------------------+-------+---------------------------------|
| 1    | Monday            | 0-53  | with more than 3 days this year |
|------+-------------------+-------+---------------------------------|
| 2    | Sunday            | 1-53  | with a Sunday in this year      |
|------+-------------------+-------+---------------------------------|
| 3    | Monday            | 1-53  | with more than 3 days this year |
|------+-------------------+-------+---------------------------------|
| 4    | Sunday            | 0-53  | with more than 3 days this year |
|------+-------------------+-------+---------------------------------|
| 5    | Monday            | 0-53  | with a Monday in this year      |
|------+-------------------+-------+---------------------------------|
| 6    | Sunday            | 1-53  | with more than 3 days this year |
|------+-------------------+-------+---------------------------------|
| 7    | Monday            | 1-53  | with a Monday in this year      |
+--------------------------------------------------------------------+

这些模式中的一种是否会提供一年中的 ISO 8601 周?

【问题讨论】:

  • +1 便于搜索(我用谷歌搜索了“mysql week ISO-8601”,这个问题是第一个结果)

标签: mysql iso8601


【解决方案1】:

在 ISO 周编号中,星期一是一周的第一天,因此仅此一项就可以将其范围缩小为奇数模式之一。

Per Wikipedia:

第 1 周有相互等价的描述:

  • 包含一年中第一个星期四的那一周(正式的 ISO 定义),
  • 1 月 4 日所在的那一周,
  • 大部分(四天或更多)天在起始年份的第一周,并且
  • 从 12 月 29 日至 1 月 4 日期间的星期一开始的那一周。

这些描述中的第三个匹配上表中的“今年超过 3 天”,所以现在我们将其缩小到 1 或 3。

最后,仍然来自维基百科(强调添加):

如果 1 月 1 日在星期一、星期二、星期三或星期四,则在第 01 周。如果 1 月 1 日在星期五、星期六或星期日,则在上一年的第 52 或 53 周(没有第 00 周)

因此,范围必须是 1-53,而不是 0-53。这反过来意味着正确的模式是模式 3

【讨论】:

  • 要验证此答案是否正确,请参阅 ISO 8601 第 2.2.8 和 2.2.10 部分中“日历周”和“日历周数”的官方定义。为了澄清为什么没有第 0 周,“日历周数”被定义为“序数”,序数从 1 开始。
  • 我在维基百科上阅读 with 3 days this year 而不是 with more than 3 days this year。最后我想通了。感谢这个解释清楚的答案!
  • 仍然认为“3”应该是默认模式,因为这与我们大多数人使用的日历相对应。出于某种书呆子的原因,这是一种允许“第 0 周”的模式,我必须提醒自己和谷歌这些模式,以避免对我的一个客户造成潜在的灾难。
【解决方案2】:

我知道这个问题很老了,但它的 SEO 定位很好 :) 所以只是为了让答案更完整 - 在显示年份和周数时,您可以使用:

DATE_FORMAT(your_date_here, "%x-%v")

它将为 "%v" (1-53) 生成 iso 周数,为 "%x" 生成正确的年份数。

【讨论】:

  • 不错。这很适合报道!谢谢!
  • 要制作这个ISO-8601 compliant,格式必须为'%x-W%v''%xW%v'
【解决方案3】:

对于法国,您必须放入文件 /etc/mysql/my.cnf § [Mysqld] : default_week_format = 3

注意:不适用于 YEARWEEK,需要添加模式 = 3 SELECT YEARWEEK(CURDATE(), 3)

Pour la France vous devez 修饰符 ou ajouter cette ligne dans le paragraphe [Mysqld] du fichier /etc/mysql/my.cnf : default_week_format = 3 Cela permet à la fonction WEEK de retourner les vraies numéros de semaines Française。 Attention pour la fonction YEARWEEK il faut impérativement ajouter le mode à 3 SELECT YEARWEEK(CURDATE(), 3)

【讨论】:

【解决方案4】:

ISO 8601 的答案是模式3

SELECT week(your_date_column, 3) FROM your_table

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多