【问题标题】:Date formats for weeks几周的日期格式
【发布时间】:2011-04-06 09:49:39
【问题描述】:

根据文档,我很难弄清楚如何将 Perl 和 MySQL 之间的周数等同起来。

如何在 Perl 和 MySQL 中根据同一时区的 unix 时间戳计算相同的确切周数?

SELECT DATE_FORMAT(from_unixtime(datefield), '%Y%U') FROM table;

print strftime('%Y%U', localtime($datevar));

应该为任何给定的时间戳生成相同的周数。理想情况下,我希望周数是可移植的,例如ISO 8601。虽然我的测试中的星期数有时似乎匹配,但我在 Perl 和 MySQL 的文档中找不到任何可以确认日期格式明确遵守相同定义的内容。

谢谢!

【问题讨论】:

标签: mysql perl date


【解决方案1】:

对于 Perl,请查看 DateTime 模块。它提供了一个week() 方法,可以返回给定DateTime 对象一年中的周数:

($week_year, $week_number) = $dt->week;

请注意,年份很重要,因为上一年或下一年的日期可以在一周内。这是因为“周”的 ISO 标准,其中一年的第一周包含一月的第四天。因此,像 1 月 1 日这样的日期可能在前一年的最后一周。

在未经训练的人看来,MySQL 的 YEARWEEK() 函数似乎可以做同样的事情,或者像 Mikey1980 suggests 一样,试试 WEEKOFYEAR() 函数。看起来YEARWEEK() 做了同样的事情,正如its documentation 所说:

结果中的年份可能与一年中第一周和最后一周的日期参数中的年份不同。

...但我不能保证他们会做同样的事情。 :-)

【讨论】:

  • DateTime 的 week 使用 ISO 8601 定义。要让 MySQL 也这样做,请使用模式 3:YEARWEEK(from_unixtime(datefield), 3)
  • 注意:POSIX strftime 函数的 %U 确实使用 ISO 8601 定义的周数。 POSIX 将 1 月的第一个星期日定义为第 1 周的第一天(之前的任何几天都构成第 0 周的一部分)。
【解决方案2】:

对于 MySQL,试试这个查询:

SELECT WEEKOFYEAR(from_unixtime(datefield)) FROM table;

抱歉,这只是您寻找的答案的 1/2,但希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-01
    • 2021-11-01
    • 2017-05-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多