【问题标题】:Mysql list dates between date range but only on specific days of the weekMysql列出日期范围之间的日期,但仅在一周中的特定日期
【发布时间】:2018-08-05 20:41:08
【问题描述】:

我正在使用下面的代码来获取日期范围之间的日期列表。

SELECT ADDDATE('2012-02-10', INTERVAL @i:=@i+1 DAY) AS DAY
FROM (
SELECT a.a
FROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a
CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b
CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c
) a
JOIN (SELECT @i := -1) r1
WHERE 
@i < DATEDIFF('2012-02-15', '2012-02-10')

现在我只想列出与一周中特定日期匹配的日期(即仅在日期为星期一或星期四时才返回)。

有什么想法吗?

【问题讨论】:

    标签: mysql date range dayofweek


    【解决方案1】:

    使用从星期一开始的函数 WEEKDAY() 来计算。

    例如:

    where WEEKDAY(DAY) = 'Monday';
    

    超过一天使用 in 关键字:

    where WEEKDAY(DAY) in ('Monday', 'Tuesday','Friday');
    

    当您使用别名时,您必须使用 have 而不是 where:

    having WEEKDAY(DAY) in ('Monday', 'Wednesday');
    

    最终查询:

    SELECT ADDDATE('2018-03-01', INTERVAL @i:=@i+1 DAY) AS DAY
    FROM (
    SELECT a.a
    FROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a
    CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b
    CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c
    ) a
    JOIN (SELECT @i := -1) r1
    WHERE 
    @i < DATEDIFF('2018-03-20', '2018-03-01') having WEEKDAY(DAY) in        
    ('Monday', 'Wednesday');
    

    【讨论】:

    • 所以我将它添加到查询的末尾(即 AND WEEKDAY(DAY) = 'Monday';)但它失败了。
    • "where 子句中的未知列 'DAY'"
    • 那是因为 where 子句看不到别名造成的...也许您可以尝试调整 ADDDATE 函数?
    • 我不明白你的意思,你能给我举个例子吗?
    • 先解释一下你想做什么,然后我才能想出一个解决方案。如果你没有描述你的代码的目的,我不能让我的答案更准确。因为如果您真的只是想按照上面描述的方式进行操作,那么这是最复杂的方法。
    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多