MYSQL给定星期和年份中星期一的日期,模式7

时间:2018-10-18 13:25:30

标签: mysql

我试图通过给定的星期数和年份来获取第一个星期一的日期。

我找到了以下代码:price

在大多数情况下,它在SELECT STR_TO_DATE(CONCAT('20131',' Monday'), '%x%v %W') as MQK;之后起作用,但我希望在mode 3中使用它。 Date and Time Functions

例如,如果年份为2013年,第1周为:

mode 7

我期望的日期为mysql> SELECT STR_TO_DATE(CONCAT('20131',' Monday'), '%x%v %W') as first_day; +------------+ | first_day | +------------+ | 2012-12-31 | +------------+ 1 row in set (0.00 sec)

有可能吗?

1 个答案:

答案 0 :(得分:3)

您将必须实现一个条件来模拟模式7的行为。

SELECT @y := 2013 as `@y`, @w := 1 as `@w`,
       @d := STR_TO_DATE(CONCAT(@y, @w, ' Monday'), '%x%v %W') as `@d`,
       IF (YEAR(@d) < @y, DATE_ADD(@d, INTERVAL 1 WEEK), @d) as first_day;

您会得到:

+------+----+------------+------------+
| @y   | @w | @d         | first_day  |
+------+----+------------+------------+
| 2013 |  1 | 2012-12-31 | 2013-01-07 |
+------+----+------------+------------+

而且,在2007年1月1日是一年中的第一个星期一:

SELECT @y := 2007 as `@y`, @w := 1 as `@w`,
       @d := STR_TO_DATE(CONCAT(@y, @w, ' Monday'), '%x%v %W') as `@d`,
       IF (YEAR(@d) < @y, DATE_ADD(@d, INTERVAL 1 WEEK), @d) as first_day;

+------+----+------------+------------+
| @y   | @w | @d         | first_day  |
+------+----+------------+------------+
| 2007 |  1 | 2007-01-01 | 2007-01-01 |
+------+----+------------+------------+

添加了2018-10-25:

因此,这显然不适用于2013年的第2周,使用上面的查询结果,2013-01-07实际上是第1周的星期一。事后看来,基于我的方法,这很明显最初提出来的,明显的解决方案就让我惊讶了。

SELECT @y := 2013 as `@y`, @w := 1 as `@w`,
       @d := STR_TO_DATE(CONCAT(@y, @w, ' Monday'), '%x%v %W') as `@d`,
       IF (WEEK(@d, 7) <> @w, DATE_ADD(@d, INTERVAL 1 WEEK), @d) as first_day;

+------+----+------------+------------+
| @y   | @w | @d         | first_day  |
+------+----+------------+------------+
| 2013 |  1 | 2012-12-31 | 2013-01-07 |
+------+----+------------+------------+

SELECT @y := 2013 as `@y`, @w := 2 as `@w`,
       @d := STR_TO_DATE(CONCAT(@y, @w, ' Monday'), '%x%v %W') as `@d`,
       IF (WEEK(@d, 7) <> @w, DATE_ADD(@d, INTERVAL 1 WEEK), @d) as first_day;

+------+----+------------+------------+
| @y   | @w | @d         | first_day  |
+------+----+------------+------------+
| 2013 |  2 | 2013-01-07 | 2013-01-14 |
+------+----+------------+------------+

嘿。