【问题标题】:working days calculation query - working but not able to understand工作日计算查询 - 工作但无法理解
【发布时间】:2015-07-22 06:54:30
【问题描述】:

我想计算一年的工作日数(不包括周六和周日),并从网络及其工作中得到这个查询..但我无法从 MID 部分理解这个查询..谁能帮助我明白这一点...

SELECT 5 * (DATEDIFF('2015-12-31', '2015-01-01') DIV 7) +
    MID('0123444401233334012222340111123400012345001234550', 7 * WEEKDAY('2015-12-31') +
    WEEKDAY('2015-01-01') + 1, 1)

我无法理解

MID('0123444401233334012222340111123400012345001234550', 7 * WEEKDAY('2015-12-31') +
WEEKDAY('2015-01-01') + 1, 1)

【问题讨论】:

标签: mysql database days


【解决方案1】:

WEEKDAY('2015-12-31')WEEKDAY('2015-01-01') 正在计算一年的开始和结束的星期几,其中 0 = 星期一,6 = 星期日。对于 2015 年,这些都是 6(星期日)。所以MID的中间参数是7 * 6 + 6 + 1,也就是49。

长字符串的第 49 个字符是0。所以这意味着它将向表达式的其余部分添加零。

这个表达式的目的是根据一年中的第一天和最后一天是星期几来调整工作日计数。在 2015 年,两者都不是工作日,因此它加零。现在考虑 2016 年。2016 年 1 月 1 日是星期一 (weekday=1),2016 年 12 月 31 日是星期二 (weekday=2)。 7*1+2+1 等于 10。长字符串的第十个字符是1。所以它会增加一个工作日......直观地我们可以看到这是因为 2016 年是闰年,所以一年中多了一天。等等。对于一年中每个可能的开始和结束日期,长字符串编码了要添加多少工作日的调整。我想这个字符串是通过反复试验发现的。

【讨论】:

  • 是的,过去 10 分钟盯着这个查询真的很痛苦。
  • 感谢@Bioshade 上面的链接,我看到长字符串有一些逻辑,而不是反复试验。哦,好吧。
  • 罗斯,我很高兴帮助你:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 2017-03-08
  • 2018-07-10
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
相关资源
最近更新 更多