mysql中每月每周的函数

mysql中每月每周的函数,sql,mysql,function,Sql,Mysql,Function,我在寻找一个简单的函数,在mysql查询中获取每月的一周(而不是一年中最简单的一周) 我能想到的最好办法是: WEEK(dateField) - WEEK(DATE_SUB(dateField, INTERVAL DAYOFMONTH(dateField)-1 DAY)) + 1 我很想知道我是否正在重新发明轮子,是否有更简单、更干净的解决方案?好的,这个月的第一周没有标准 一年的第一周是包含1月4日的一周 你如何定义一个月的第一周 更新: 您需要像这样重写查询: SELECT WEEK(d

我在寻找一个简单的函数,在mysql查询中获取每月的一周(而不是一年中最简单的一周)

我能想到的最好办法是:

WEEK(dateField) - WEEK(DATE_SUB(dateField, INTERVAL DAYOFMONTH(dateField)-1 DAY)) + 1

我很想知道我是否正在重新发明轮子,是否有更简单、更干净的解决方案?

好的,这个月的第一周没有标准

一年的第一周是包含
1月4日
的一周

你如何定义一个月的第一周

更新:

您需要像这样重写查询:

SELECT  WEEK(dateField, 5) -
        WEEK(DATE_SUB(dateField, INTERVAL DAYOFMONTH(dateField) - 1 DAY), 5) + 1
以便正确处理年份转换,周从
周一开始


否则,您的查询就可以了。

有一种替代方法有时用于报表数据库。这是为了创建一个表,我们称之为ALMANAC,它每个日期有一行(键),并且有可能对报告有用的日期的每个必要属性

除了“每月的一周”列之外,还可以有一个列来说明该日期是否为公司假日,以及诸如此类的事情。如果公司的会计年度从7月或其他月份开始,则可以包括每个日期所属的会计年度、会计月、会计周等

然后编写一个程序,在给定要填充的日期范围的情况下,无中生有地填充此表。在这个程序中只包含一次所有疯狂的日历计算


然后,当您需要知道某个其他表中某个日期的属性时,只需进行联接,并使用列即可。是的,这是一个加入。不,这个表没有标准化。但对于某些非常特殊的需求来说,它仍然是一个很好的设计。

我的解决方案是从周日开始的一周

(为了向未来的读者澄清:这个老问题的答案之所以被添加,是因为悬赏意味着当前的答案并不令人满意,所以我添加了这个解决方案/定义,以及针对各种情况的附加“配置选项”。)

对于月的
,没有标准定义,但一般解决方案是以下公式,您可以根据需要进行配置:

select (dayofmonth(dateField) + 6 + (7 - "min_days_for_partial_week") 
        - (weekday(datefield) - "weekday_startofweek" + 7) MOD 7) DIV 7 as week_of_month;
在哪里

  • “weekday\u startofweek”
    必须替换为希望成为一周第一天的工作日(
    0=周一
    6=周日
  • “部分周的最小天数”
    是第一周必须计为第1周的天数(值
    1
    7
    )。常用值为
    1
    (一个月的第一天始终是第1周)、
    4
    (这类似于“一年中的iso周”,其中一年中的第一周是包含星期四的一周,因此至少有4天),以及
    7
    (第1周是第一个完整的周)
此公式将返回值
0
6
<代码>0表示当前周是不完整的一周,没有足够的天数计算为第1周,
6
只能在允许不到3天的不完整周作为第1周时发生

示例:

如果一周的第一天是星期一(
“weekday\u startofweek”=0
),而第1周应该始终是一整周(
“min\u days\u for u partial\u week”=7
),这将简化为

select (dayofmonth(dateField) + 6 - weekday(datefield)) DIV 7 as week_of_month;
例如,对于
2016-06-02
您将获得
0
,因为2016年6月从周三开始,对于
2016-06-06
您将获得
1
,因为这是2016年6月的第一个周一

为了模拟您的公式,如果一周的第一天始终是第1周(
“min\u days\u for_partial\u week”=1
),并且该周从星期日开始(
“weekday\u startofweek”=6
),则

select (dayofmonth(dateField) + 12 - (weekday(datefield) + 1) MOD 7) DIV 7 as week_of_month;

尽管您可能希望在两年后正确地对此进行评论,以了解常量的来源。

我想这可能不是最通用的解决方案,但对于我需要的,一周从周一开始。因此,假设一个月的第一个星期日是星期日,那么这个星期日将被算作第1周。如果这有道理的话。。。
select (dayofmonth(dateField) + 12 - (weekday(datefield) + 1) MOD 7) DIV 7 as week_of_month;