最后n个工作日在sql where子句中

时间:2012-07-27 17:11:42

标签: mysql timestamp period

我们使用MySQL作为我们的数据库来存储带有时间戳的消息。是否可以创建一个返回最后n个工作日消息的查询?

即。如果n是4而今天是星期二,我想要周一,周五,周四,周四和周三最后一周的消息。

4 个答案:

答案 0 :(得分:2)

如果你想直接用mysql做这个,那会有点复杂。正如Vatev建议你应该提前计算日期星期日,但如果你真的想这样做,你可能需要以下功能:

首先,你需要计算你应该回去多少周,这很容易......对你来说one week = 5 days,这意味着

weeks = FLOOR(days / 5)

我们已经照顾好几周了,所以我们现在必须与其他人合作:

rest = days MOD 5

现在我们有两个案例,周末已经发生或没有,因为没有周末日是好的。我们必须加2天才能跳过它。周末发生在(WEEKDAY(now) - rest) < 0

rest = IF( (WEEKDAY(now) - rest) < 0, rest + 2, rest)

现在我们可以将其构建为一个标准杆(让我们假设您预先计算了{days}{rest}):

WHERE date >= ADD_DATE(
    ADD_DATE (
        {now},
        INTERVAL -IF( (WEEKDAY({now}) - {rest}) < 0, {rest} + 2, {rest}) DAYS, 
    ),
    INTERVAL -FLOOR({days} / 5) WEEKS
)

答案 1 :(得分:1)

我能想到的最好的方法是用您选择的语言计算开始日期(查询中的{start_date}),然后运行如下所示:

SELECT some_things
FROM your_table
WHERE 
    WEEKDAY(time_column) < 5
    AND time_column >= {start_date}
ORDER BY time_column DESC

您还可以创建一个存储函数来计算'x天前的日期'并将其用于{start_date}。

答案 2 :(得分:0)

你尝试过这样的事吗?

SELECT columns 
FROM table
WHERE datediff(column_with_timestamp,NOW()) > n

如上所述,N是您要查找的天数。

答案 3 :(得分:0)

COL >= date_sub( NOW(), interval 1 week) and
weekday( COL ) < 5
  • date_sub用于搜索上周创建的行
  • 工作日是排除星期日或星期六