mysql给定一年中的第几周,输出这一周的日期
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql给定一年中的第几周,输出这一周的日期相关的知识,希望对你有一定的参考价值。
比如,我要查询2015年第22周,是什么日期到什么日期,请问mysql里该怎么写查询语句?在线等。。。
那么你的数据表中需要有个字段是数据添加的时间,而且最好是时间戳格式,也就是10位的数值。然后查询的时候可以用时间间隔的where条件来查询,例如要查询2015年第22周,那么开始时间就是2015年1月1日的时间戳+21*604800,因为一周是604800秒,所以用21乘以604800,这样得到开始时间,那结束时间就是开始时间再加604800秒,查询的时候语句就是select * from 数据表 where 时间戳字段>开始时间 and 时间戳字段<结束时间; 这样就可以查到了。 参考技术A SET @wk = 10;-- 第10周SELECT
-- 获取当前时间 -> 获取今年年份 -> 转换为今年1月1号 -> 转换为时间戳 -> 加上周*天*时*分*秒 -> 转换为日期(该日期不一定为周一,视当年1月1号定)
from_unixtime( unix_timestamp( MAKEDATE( YEAR ( NOW( ) ), 1 ) ) + @wk * 7 * 24 * 60 * 60 ) AS '今年一月一号第10周的日期',
-- 获取当前日期是周几 然后加1
-- DAYOFWEEK(date) 返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六)。这些索引值对应于ODBC标准
-- WEEKDAY(date) 返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)
weekday(
from_unixtime( unix_timestamp( MAKEDATE( YEAR ( NOW( ) ), 1 ) ) + @wk * 7 * 24 * 60 * 60 )
) + 1 AS '周几',
-- 根据第几周后的日期 减 那天到周一的时间戳 得出今年第几周的周一日期
from_unixtime(
unix_timestamp( MAKEDATE( YEAR ( NOW( ) ), 1 ) ) + @wk * 7 * 24 * 60 * 60 - (
weekday(
from_unixtime( unix_timestamp( MAKEDATE( YEAR ( NOW( ) ), 1 ) ) + @wk * 7 * 24 * 60 * 60 )
) * 24 * 60 * 60
)
)
感觉我这个复杂了,如有更好的方法请指出,谢谢喽
参考技术B mysql给定一年中的第几周,输出这一周的日期那么你的数据表中需要有个字段是数据添加的时间,而且最好是时间戳格式,也就是10位的数值。然后查询的时候可以用时间间隔的where条件来查询,例如要查询2015年第22周,那么开始时间就是2015年1月1日的时间戳+21*604800,因为一周是604800秒,所以用21乘以604800,这样得到开始时间,那结束时间就是开始时间再加604800秒,查询的时候语句就是select * from 数据表 where 时间戳字段>开始时间 and 时间戳字段<结束时间; 这样就可以查到了。 参考技术C 这个是用php来做的吧
mysql中每月一周的功能
【中文标题】mysql中每月一周的功能【英文标题】:Function for week of the month in mysql 【发布时间】:2010-10-21 13:49:18 【问题描述】:我正在寻找一个简单的函数来在 mysql 查询中获取月份中的第几周(而不是一年中最简单的一周)。
我能想到的最好的是:
WEEK(dateField) - WEEK(DATE_SUB(dateField, INTERVAL DAYOFMONTH(dateField)-1 DAY)) + 1
我很想知道我是否在这里重新发明***,是否有更简单、更清洁的解决方案?
【问题讨论】:
【参考方案1】:AFAIK,每月第一周没有标准。
一年的第一周是包含Jan 4th
的那一周。
你如何定义一个月的第一周?
更新:
您需要像这样重写您的查询:
SELECT WEEK(dateField, 5) -
WEEK(DATE_SUB(dateField, INTERVAL DAYOFMONTH(dateField) - 1 DAY), 5) + 1
以便正确处理年份转换,并从Monday
开始。
否则,您的查询没问题。
【讨论】:
我想这可能不是最通用的解决方案,但我需要从星期一开始一周。所以说这个月的 1 号是星期天,那个星期天将被算作第 1 周。如果这是有道理的......【参考方案2】:报告数据库中有时会使用另一种方法。它是创建一个表,我们称之为 ALMANAC,每个日期有一行(键),并且具有可能对报告目的有用的每个所需的日期属性。
除了月份的星期几列之外,还可以有一列显示日期是否为公司假日,诸如此类。如果贵公司的会计年度从 7 月或其他月份开始,则可以包括每个日期所属的会计年度、会计月、会计周等。
然后,您编写一个程序来凭空填充此表,给定要填充的日期范围。您只需在此程序中包含所有疯狂的日历计算。
然后,当您需要知道某个其他表中某个日期的属性时,您只需进行连接,并使用该列。是的,这又是一次加入。不,这个表没有标准化。但对于某些非常特殊的需求,它仍然是很好的设计。
【讨论】:
【参考方案3】:我的一周解决方案从星期日开始。
SELECT ( 1 + ((DATE_FORMAT( DATE_ADD(LAST_DAY( DATE_ADD('2014-07-17', INTERVAL -1 MONTH)), INTERVAL 1 DAY),'%w')+1) + (DATE_FORMAT('2014-07-17', '%d')-2) ) DIV 7) "week_of_month";
【讨论】:
【参考方案4】:(只是为了向未来的读者澄清一下:这个旧问题的答案是由于暗示当前答案不令人满意的赏金而添加的,所以我添加了这个解决方案/定义以及针对各种类型的附加“配置选项”情况。)
Week of month
没有标准定义,但一般的解决方案是以下公式,您可以根据需要进行配置:
select (dayofmonth(dateField) + 6 + (7 - "min_days_for_partial_week")
- (weekday(datefield) - "weekday_startofweek" + 7) MOD 7) DIV 7 as week_of_month;
在哪里
"weekday_startofweek"
必须替换为您希望成为一周第一天的工作日(0 = Monday
、6 = Sunday
)。
"min_days_for_partial_week"
是第一周必须算作第 1 周的天数(值 1
到 7
)。常见值为 1
(每月的第一天始终是第 1 周)、4
(这类似于“iso week of the year”,其中一年的第一周是包含星期四,至少还有 4 天)和7
(第 1 周是第一个完整的一周)。
此公式将返回值 0
到 6
。 0
表示当前周是没有足够天数计为第 1 周的部分周,而 6
只能在您允许少于 3 天的部分周作为第 1 周时发生。
例子:
如果您一周的第一天是星期一 ("weekday_startofweek" = 0
) 并且第一周应该始终是一整周 ("min_days_for_partial_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_days_for_partial_week" = 1
),一周从星期日开始 ("weekday_startofweek" = 6
),这将是
select (dayofmonth(dateField) + 12 - (weekday(datefield) + 1) MOD 7) DIV 7 as week_of_month;
虽然您可能想正确地评论一下,以便在 2 年内知道您的常量来自哪里。
【讨论】:
【参考方案5】:可能已经晚了 12 年,但万一有人还在寻找,我在 bigquery MySQL 中使用这个计算来计算每月的周数。
我将星期一作为计算的第一天
case when
(case when EXTRACT(DAYOFWEEK FROM date_add(date(my_date), INTERVAL -(EXTRACT(DAY FROM my_date))+1 day)) = 1 then 7
else EXTRACT(DAYOFWEEK FROM date_add(date(my_date), INTERVAL -(EXTRACT(DAY FROM my_date))+1 day)) -1 end) > 1 then -- check first day of month to decide if it's a complete week (starts on Monday)
case when EXTRACT(DAY FROM my_date) <= 7 then -- for incomplete week
case when
(case when EXTRACT(DAYOFWEEK FROM my_date) = 1 then 7 else EXTRACT(DAYOFWEEK FROM my_date)-1 end) - EXTRACT(DAY FROM my_date) =
(case when EXTRACT(DAYOFWEEK FROM date_add(date(my_date), INTERVAL -(EXTRACT(DAY FROM my_date))+1 day)) = 1 then 7
else EXTRACT(DAYOFWEEK FROM date_add(date(my_date), INTERVAL -(EXTRACT(DAY FROM my_date))+1 day)) -1 end) -1 then 1 -- incomplete week 1
else FLOOR(( EXTRACT(DAY FROM my_date) + (case when EXTRACT(DAYOFWEEK FROM date_add(date(my_date), INTERVAL -(EXTRACT(DAY FROM my_date))+1 day)) = 1 then 7
else EXTRACT(DAYOFWEEK FROM date_add(date(my_date), INTERVAL -(EXTRACT(DAY FROM my_date))+1 day)) -1 end) -2 )/7)+1 end -- calculate week based on date
else FLOOR(( EXTRACT(DAY FROM my_date) + (case when EXTRACT(DAYOFWEEK FROM date_add(date(my_date), INTERVAL -(EXTRACT(DAY FROM my_date))+1 day)) = 1 then 7
else EXTRACT(DAYOFWEEK FROM date_add(date(my_date), INTERVAL -(EXTRACT(DAY FROM my_date))+1 day)) -1 end) -2 )/7)+1 end -- calculate week based on date
else FLOOR((EXTRACT(DAY FROM my_date)-1)/7)+1 -- for complete week
end
我们的想法是将日差(星期一到该月的第一天)添加到日期,以便正确划分周 > 1
对于第 1 周(
【讨论】:
以上是关于mysql给定一年中的第几周,输出这一周的日期的主要内容,如果未能解决你的问题,请参考以下文章
Excel中如何计算日期所在的这年的第几周,以周一作为一周的第一天
JAVA给一个时间获取一年的第几周,正常自然周是 星期一至星期日为一周,
Excel 2010 得到当天的日期/得到一年中的第几周/得到当前一周中的星期几