0

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

即如果 n 是 4 并且今天是星期二,我想要来自本周星期一、上周星期五、上周星期四和上周星期三的消息。

4

4 回答 4

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
)
于 2012-07-27T17:37:48.257 回答
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}。

于 2012-07-27T17:21:50.860 回答
0
COL >= date_sub( NOW(), interval 1 week) and
weekday( COL ) < 5
  • date_sub 是寻找上周创建的行
  • weekday 是排除周日或周六
于 2012-07-27T17:25:58.390 回答
0

你有没有尝试过这样的事情?

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

其中 N 是您在上面定义的,您要查找的天数。

于 2012-07-27T17:19:37.803 回答