mysql中每月每周的函数
我在寻找一个简单的函数,在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
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;