MySQL WEEK如何(日期[,模式]);工作或我在这里做错了什么?

时间:2015-04-21 14:03:40

标签: mysql date

我需要获取给定日期的一周的开始和结束日期。 我需要在给定日期的一周从星期一开始。

如果我使用mode选项运行此查询。

SELECT EXTRACT(YEAR FROM '2015-01-20') YEAR,
       WEEK('2015-01-20') WK_No ,
       STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20'), 'Monday'), '%X%V %W') Mon,
       STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20'), 'Tuesday'), '%X%V %W') Tues,
       STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20'), 'Wednesday'), '%X%V %W') Wed,
       STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20'), 'Thursday'), '%X%V %W') Thur,
       STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20'), 'Friday'), '%X%V %W') Fri,
       STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20'), 'Saturday'), '%X%V %W') Sat,
       STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20'), 'Sunday'), '%X%V %W') Sun;

我得到以下结果

YEAR WK_No Mon          Tues        Wed         Thur        Fri         Sat         Sun
2015 3     2015-01-19   2015-01-20  2015-01-21  2015-01-22  2015-01-23  2015-01-24  2015-01-18

这周从太阳18日开始

根据mysql的帮助 http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_week

如果我将模式设置为1,3,5,7,我的星期应该在星期一开始,但没有一个星期一开始 如果我使用模式1或3,例如模式1

SELECT EXTRACT(YEAR FROM '2015-01-20') YEAR,
       WEEK('2015-01-20',1) WK_No ,
       STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20',1), 'Monday'), '%X%V %W') Mon,
       STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20',1), 'Tuesday'), '%X%V %W') Tues,
       STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20',1), 'Wednesday'), '%X%V %W') Wed,
       STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20',1), 'Thursday'), '%X%V %W') Thur,
       STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20',1), 'Friday'), '%X%V %W') Fri,
       STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20',1), 'Saturday'), '%X%V %W') Sat,
       STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20',1), 'Sunday'), '%X%V %W') Sun;

我的结果是错误的,这是不正确的

YEAR    WK_No   Mon         Tues        Wed         Thur        Fri         Sat         Sun
2015    4       2015-01-26  2015-01-27  2015-01-28  2015-01-29  2015-01-30  2015-01-31  2015-01-25

我得到一个不包括日期的星期,而星期日仍在星期日开始

如果我使用模式5或7,例如模式5

SELECT EXTRACT(YEAR FROM '2015-01-20') YEAR,
       WEEK('2015-01-20',5) WK_No ,
       STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20',5), 'Monday'), '%X%V %W') Mon,
       STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20',5), 'Tuesday'), '%X%V %W') Tues,
       STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20',5), 'Wednesday'), '%X%V %W') Wed,
       STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20',5), 'Thursday'), '%X%V %W') Thur,
       STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20',5), 'Friday'), '%X%V %W') Fri,
       STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20',5), 'Saturday'), '%X%V %W') Sat,
       STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20',5), 'Sunday'), '%X%V %W') Sun;

我得到的结果与不使用模式选项相同。

YEAR WK_No Mon          Tues        Wed         Thur        Fri         Sat         Sun
2015 3     2015-01-19   2015-01-20  2015-01-21  2015-01-22  2015-01-23  2015-01-24  2015-01-18

如何获取给定日期的一周的开始和结束日期。 在给定日期的一周从星期一开始?

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望分别找到您提供输入日期的星期一,星期一和星期日的开始和结束日期。

使用DATE_ADD和SUBDATE函数可以比现在尝试做的更容易。

有关这些功能的更多信息,请查看the documentation.

通过这些查询,您可以创建一个功能来为您处理此问题。 DATE()可能会工作而不是投射,当我回家时会调查它。

本周的下周日:

SELECT CAST('2015-04-22' + INTERVAL (6-WEEKDAY('2015-04-22')) day AS DATE);

本周开始:

SELECT CAST(SUBDATE('2015-04-26', WEEKDAY('2015-04-26')) AS DATE);

编辑:有点太快反应,编辑查询,本周末可能有点过于复杂,我回到家时会调查它。

答案 1 :(得分:0)

只是回答原始查询错误的原因:您使用STR_TO_DATE%X%V %W作为格式掩码,它使用提供的周数将字符串转换为正确的日期。但是,此功能也需要了解您的“周开始”。

根据DATE_FORMAT docs,有以下选项:

%V  Week (01..53), where Sunday is the first day of the week; WEEK() mode 2; used with %X
%v  Week (01..53), where Monday is the first day of the week; WEEK() mode 3; used with %x

因此,你应该使用例如STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM '2015-01-20'), WEEK('2015-01-20',1), 'Monday'), '%x%v %W') Mon来让周从星期一开始。