【问题标题】:Return results of query based on todays date in SQL (MySQL)在 SQL (MySQL) 中返回基于今天日期的查询结果
【发布时间】:2012-07-15 14:42:44
【问题描述】:

我有一个查询,我得到了帮助,但我遇到了另一个问题。

我的代码是

SELECT a.name, COUNT(*) AS num FROM table2 b 
INNER JOIN table1 a 
ON b.status_id=a.id 
GROUP BY status_id

我现在想做的是只显示在当前日期输入的结果?日期列在表 2 中。日期列的格式是日期和时间(例如 1341241153),由 CRM 以这种方式自动设置。我不确定这是什么格式!

我只需要检查日期是否与当天匹配。我希望这很清楚。

这是一个 MySQL 数据库。

任何帮助将不胜感激!

【问题讨论】:

    标签: mysql sql where-clause


    【解决方案1】:

    使用这个解决方案:

    SELECT     a.name, COUNT(*) AS num
    FROM       table2 b
    INNER JOIN table1 a ON b.status_id = a.id
    WHERE      b.datecol >= UNIX_TIMESTAMP(CURDATE()) AND
               b.datecol < UNIX_TIMESTAMP(CURDATE() + INTERVAL 1 DAY)
    GROUP BY   b.status_id
    

    这将避免将您的日期列包装在一个函数中,这会使查询不可分割(即不能使用索引)。通过在裸日期列上进行比较,MySQL 仍然能够利用索引(如果您在日期列上设置了索引),并且应该非常有效。

    如果您绝对知道输入的日期永远不会是未来的某个时间(即明天或后天),您可以进一步简化它:

    SELECT     a.name, COUNT(*) AS num
    FROM       table2 b
    INNER JOIN table1 a ON b.status_id = a.id
    WHERE      b.datecol >= UNIX_TIMESTAMP(CURDATE())
    GROUP BY   b.status_id
    

    第二个条件检查被删除,因为它不需要检查它是否在未来的一天。

    【讨论】:

    • 也感谢您的回答。这也很完美!我对另一块 MySQL 也有类似的问题,是否也可以提供帮助? Link to new Question
    【解决方案2】:

    您应该在包含 1341241153 等值的日期列上使用 from_unixtime() 函数。
    因为这些值似乎以 unix 时间戳格式存储。

    示例

    mysql> select
        ->     from_unixtime( 1341241153 ) as 'my_datetime_1341241153',
        ->     date( from_unixtime( 1341241153 ) ) as 'my_date_1341241153',
        ->     curdate(),
        ->     curdate() > date( from_unixtime( 1341241153 ) ) 'is_today_later?',
        ->     curdate() = date( from_unixtime( 1341241153 ) ) 'is_today_equal?',
        ->     curdate() < date( from_unixtime( 1341241153 ) ) 'is_today_before?'
        -> from
        ->     dual
        -> \G
    *************************** 1. row ***************************
    my_datetime_1341241153: 2012-07-02 20:29:13
        my_date_1341241153: 2012-07-02
                 curdate(): 2012-07-15
           is_today_later?: 1
           is_today_equal?: 0
          is_today_before?: 0
    1 row in set (0.00 sec)
    

    您的查询应该是:

    SELECT a.name, COUNT(*) AS num FROM table2 b 
    INNER JOIN table1 a 
    ON ( b.status_id=a.id and curdate() = date( from_unixtime( b.crm_date_time_column ) ) )
    GROUP BY status_id
    

    【讨论】:

    • 绝对完美!非常感谢你的帮助!我已经申请将此应用于我需要做的大多数查询,除了我仍然遇到问题的查询!我为此创建了另一个问题。如果你也能帮忙,那就太棒了。 link
    【解决方案3】:

    试试这个::

    SELECT a.name, COUNT(*) AS num FROM table2 b 
    INNER JOIN table1 a 
    ON b.status_id=a.id 
    
    where DATE(column_date) = DATE(now())  
    GROUP BY status_id
    

    【讨论】:

    • 记住 OP 声明 column_date 持有日期 AND 时间,所以 2012-07-15 12:49:36 2012-07-15 00:00:00 (DATE 的输出(NOW ()),即使是在同一天。
    猜你喜欢
    • 2012-07-14
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 2012-10-22
    • 2021-05-21
    • 1970-01-01
    • 2018-08-11
    相关资源
    最近更新 更多