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 = Monday6 = Sunday)。 "min_days_for_partial_week" 是第一周必须算作第 1 周的天数(值 17)。常见值为 1(每月的第一天始终是第 1 周)、4(这类似于“iso week of the year”,其中一年的第一周是包含星期四,至少还有 4 天)和7(第 1 周是第一个完整的一周)。

此公式将返回值 060 表示当前周是没有足够天数计为第 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给定一年中的第几周,输出这一周的日期的主要内容,如果未能解决你的问题,请参考以下文章

求关于js根据日期判断此日期是在一年中的第几周

Excel中如何计算日期所在的这年的第几周,以周一作为一周的第一天

JAVA给一个时间获取一年的第几周,正常自然周是 星期一至星期日为一周,

Excel 2010 得到当天的日期/得到一年中的第几周/得到当前一周中的星期几

js强大的日期格式化函数,不仅可以格式化日期,还可以查询星期,一年中第几天等

mysql中每月一周的功能