【问题标题】:Last n weekdays in sql where clauselsql where子句中的最后n个工作日
【发布时间】:2012-07-27 17:11:41
【问题描述】:

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

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

【问题讨论】:

    标签: mysql timestamp period


    【解决方案1】:

    如果你想直接用 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
    )
    

    【讨论】:

    • 感谢您的详细解释。正如 Vatev 指出的那样,我想我会在我的应用程序中计算开始日期,以减轻数据库的压力。
    • 此操作对数据库的压力可以忽略不计,但如果您使用更理智的语言进行操作,您的压力可能会小很多:P
    • @Thomas 我写了它,所以我可以重用任何其他语言,特别是 PHP 接受(在 strtotime 中)间隔,逻辑是相同的。您甚至可以通过timestamp() - weeks*7days*24hour*3600seconds 来节省一些资源。
    【解决方案2】:

    我能想到的最好办法是用您选择的语言计算开始日期(查询中的 {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}。

    【讨论】:

      【解决方案3】:

      你尝试过这样的事情吗?

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

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

      【讨论】:

      • 工作日,不包括周末。
      【解决方案4】:
      COL >= date_sub( NOW(), interval 1 week) and
      weekday( COL ) < 5
      
      • date_sub 是寻找上周创建的行
      • weekday 不包括星期日或星期六

      【讨论】:

        猜你喜欢
        • 2013-09-02
        • 2010-11-20
        • 1970-01-01
        • 2017-01-20
        • 1970-01-01
        • 1970-01-01
        • 2011-07-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多