如何在一个月内获得所有星期一?

时间:2015-05-26 02:29:25

标签: mysql

我想在2015年5月份获得所有星期一

(使用mysql查询)

输出:

MON   
04  
11  
18  
25

3 个答案:

答案 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)))
;

SQL小提琴:http://sqlfiddle.com/#!9/fa4ce/4

答案 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