【问题标题】:Excel WEEKNUM() vs MySQL YEARWEEK()Excel WEEKNUM() 与 MySQL YEARWEEK()
【发布时间】:2018-01-14 06:03:04
【问题描述】:

我正在创建一个打卡时间系统,到目前为止,我已经能够获得用户今天的时钟和本周的用户时钟。

最后一步是获取用户当前支付周期的当前时间。

我在 Excel 中创建了一个支付期开始和结束日期的列表。

每当您使用 Excel WEEKNUM() 或 MySQL YEARWEEK() 等函数时,这些函数都会附带一个附加选项参数。

下面的链接在表格中显示了这些模式之间的差异。

Excel WEEKNUM() table reference

MySQL YEARWEEK() table reference

我的问题是,如果我们每两周进行一次工资核算,我应该在 Excel WEEKNUM() 中设置哪种模式对应于 MySQL YEARWEEK()?

附加电子表格 clock.logic.xlsx

感谢您的帮助。

【问题讨论】:

  • 这个网站已经到了发布问题只会给你带来坏名声的地步。感谢您的反对票。它有很大帮助。这不像我在发帖或其他任何事情之前研究过这个问题。再次感谢。
  • 一些“天才”看到类似的关键字出现,所以它必须是重复的。这就是点击投票所需的所有研究。
  • 您对反对票的看法是正确的。但是对应的函数是Excel中的WEEKNUM functionISOWEEKNUM functionMySQL中的WEEK。请描述您在尝试从两者获得相同结果时遇到的问题。
  • MySQL 中的 WEEK 模式适用于双周支付期吗? 1、5 还是 7?
  • 这正是我想要的。不确定如何接受您的评论作为答案。

标签: mysql excel


【解决方案1】:

首先,好消息是:ExcelISOWEEKNUM function 对应于MySQLWEEKOFYEAR,即 WEEK(date,3)。因此确定 ISO 周数是可能的。

但所有其他WEEK 模式都是废话,因为一年中第一周的定义不符合其他地方使用的任何逻辑。例如,采用最简单的模式,将星期日作为一周的第一天,一年的第一周是一周,一年的第一天就在其中。这就是 Excels WEEKNUM function 返回 @987654330 @1 或省略。这应该是 MySQLs WEEK 在方式 0 (0-53) 或 2 (1-53) 中。但到底是什么?

SELECT WEEK('2008-01-01',0); -> 0

SELECT WEEK('2008-01-01',2); -> 52

所以MySQL 告诉我们,2008 年 1 月 1 日,星期二,是 2007 年的第 52 周吗?

真的吗?为什么?

因为MySQL 不满足规则“第 1 周是第一周……今年有星期天”。相反,MySQL 的第一周开始似乎是今年的第一个星期日。

因此,除了 ISO 周数之外,MySQL 中的所有其他周数都是错误的。有人可能会想:让我们取 0 并简单地将结果加 1。但这在 2012 年失败了。因为 2012-01-01 是星期天,而 MySQL 在方式 0 和方式 2 中给出了第 1 周。

例子:

Excel:

Date        WEEKNUM ISOWEEKNUM
2008-01-01  1       1
2008-02-01  5       5
2008-02-03  6       5
2008-02-04  6       6
2008-12-31  53      1
2009-01-01  1       1
2009-02-01  6       5
2009-12-31  53      53
2012-01-01  1       52
2012-02-01  5       5
2012-12-31  53      1
2016-01-01  1       53
2016-02-01  6       5
2016-12-31  53      52

MySQL:

drop table if exists tmp;

create table tmp (d date);

insert into tmp (d) values 
('2008-01-01'),
('2008-02-01'),
('2008-02-03'),
('2008-02-04'),
('2008-12-31'),
('2009-01-01'),
('2009-02-01'),
('2009-12-31'),
('2012-01-01'),
('2012-02-01'),
('2012-12-31'),
('2016-01-01'),
('2016-02-01'),
('2016-12-31');

select d as 'Date', week(d,0), week(d,3) from tmp;

结果:

Date        week(d,0) week(d,3)     
2008-01-01  0         1
2008-02-01  4         5
2008-02-03  5         5
2008-02-04  5         6
2008-12-31  52        1
2009-01-01  0         1
2009-02-01  5         5
2009-12-31  52        53
2012-01-01  1         52
2012-02-01  5         5
2012-12-31  53        1
2016-01-01  0         53
2016-02-01  5         5
2016-12-31  52        52

【讨论】:

  • 我已使用我用于您审核的 Excel 电子表格更新了帖子。如果您想根据我创建电子表格的方式添加任何最终想法,请告诉我。
  • 不清楚你想用那个 excel 电子表格实现什么,以及这与MySQL 有什么关系。但很高兴看到您使用ISOWEEKNUM,因为这是一个正确定义的标准。但是,您确定在一个以英寸、英尺和码而不是米来衡量长度,以盎司和磅而不是公斤来衡量重量,并且日期的格式是 M/D/Y 而不是 YYYY-MM-DD 的国家/地区,这会被容忍吗? ?
  • 但我总是不清楚。我怀疑你真正需要的是计算一年中第一个星期一的日期。或者换句话说,一年中第一个 ISO 周中的星期一的日期。这将是=DATE(B4,1,7)+(2-WEEKDAY(DATE(B4,1,7)))-7*(ISOWEEKNUM(DATE(B4,1,1))=1),其中B4 包含年份。另见stackoverflow.com/questions/45392608/…
  • @AxelRichter - 计算 ISO 年第一个星期一的更简单的公式 =DATE(B4,1,5)-WEEKDAY(DATE(B4,1,3))
【解决方案2】:

如果您想在 Excel 中计算当前支付周期的小时数,给定两周的支付周期,那么我建议您根本不需要周数(实际上这会使计算过于复杂,尤其是在开始时或年底)

如果您在A2:A100 中有日期,在B2:B100 中有这些日期的工作时间,在Z2:Z10 中有工资期开始日期列表,那么您可以使用此公式获取当前工资期的小时数

=SUMIF(A2:A100,">="&LOOKUP(TODAY(),Z2:Z10),B2:B100)

我想你的实际设置更复杂,但上面的一些变化可能仍然可以使用

【讨论】:

  • 我已使用我用于您审核的 Excel 电子表格更新了帖子。
猜你喜欢
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 2015-08-02
  • 1970-01-01
相关资源
最近更新 更多