我试图通过给定的星期数和年份来获取第一个星期一的日期。
我找到了以下代码: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)
。
有可能吗?
答案 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 |
+------+----+------------+------------+
嘿。