我想在2015年5月份获得所有星期一
(使用mysql查询)
输出:
MON
04
11
18
25
答案 0 :(得分:1)
select row+1 as Mon from
( SELECT @row := @row + 1 as row FROM
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6) t1,
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6) t2,
(SELECT @row:=-1) t3 limit 31 ) b where
DATE_ADD('2015-05-01', INTERVAL ROW DAY) between '2015-05-01' and '2015-05-31' and DAYOFWEEK(DATE_ADD('2015-05-01', INTERVAL ROW DAY))=2;
输出
+------------+
| Mon |
+------------+
| 4 |
| 11 |
| 18 |
| 25 |
+------------+
稍微调整一下query
答案 1 :(得分:1)
作为参考,这是另一个解决方案 - 请注意,最后一个条目可能为null,如果需要可以更改为另一个值,或者包含在子选择中并过滤非空。
SET @date='2015-05-01';
SET @offset=7 - WeekDay(@date);
SELECT DAY(DATE_ADD(@date,INTERVAL @offset DAY)) AS 'MON'
UNION SELECT DAY(DATE_ADD(@date,INTERVAL @offset+7 DAY))
UNION SELECT DAY(DATE_ADD(@date,INTERVAL @offset+14 DAY))
UNION SELECT DAY(DATE_ADD(@date,INTERVAL @offset+21 DAY))
UNION DISTINCT SELECT IF(DAY(DATE_ADD(@date,INTERVAL @offset+28 DAY))>21,
DAY(DATE_ADD(@date,INTERVAL @offset+28 DAY)),
DAY(DATE_ADD(@date,INTERVAL @offset+21 DAY)))
;
答案 2 :(得分:0)
此查询返回一个月中星期一的两位数日值。
这需要"月"作为该月第一天的日期,作为第一个内联视图(d0)的SELECT列表中的值。 (可以调整此内联视图查询以处理一个月内的任何日期值作为一个月的规范。)
SELECT DATE_FORMAT(d0.dt + INTERVAL d1.i*6+d2.i DAY,'%d') AS dd
-- , d0.dt + INTERVAL d1.i*6+d2.i DAY AS dt
FROM ( SELECT '2015-05-01' + INTERVAL 0 DAY AS dt
) d0
CROSS
JOIN ( SELECT 0 AS i UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5
) d1
CROSS
JOIN ( SELECT 0 AS i UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5
) d2
WHERE d0.dt + INTERVAL d1.i*6+d2.i DAY < d0.dt + INTERVAL 1 MONTH
AND NOT WEEKDAY(d0.dt + INTERVAL d1.i*6+d2.i DAY)
ORDER BY 1
注意:这需要在第一个内联视图(d0)中仅指定一次的月份。其他所有内容都在表达式中处理,引用此值。
WEEKDAY
函数返回0作为星期一的日期值,因此从WEEKDAY函数返回的NOT
将返回星期一的TRUE
。
对于提供的日期值&#39; 2015-05-01&#39;,这将返回:
dd
--
04
11
18
25