如何限制MySQL按今天的日期选择查询结果

时间:2018-03-03 19:38:21

标签: php mysql

我在某些PHP中有以下MySQL Select语句,效果很好:

以下是完整的数据集:https://www.dropbox.com/s/65dwada48xh45f1/MySQL_HomeSeerDB.sql?dl=1

SELECT CONCAT(LEFT(DATE(EntryDateTime),10),' ',HOUR(EntryDateTime),':00:00') as DateHour, SUM(HSConnectDown) as HSDownCount FROM State GROUP BY DATE(EntryDateTime),HOUR(EntryDateTime)

我想将结果限制在那些" DateHour"与今天的日期相同。我使用以下代码:

WHERE DATE('DateHour') = DATE(CONVERT_TZ(CURRENT_TIMESTAMP,'+00:00','-6:00'))

我只是不知道如何整理将会过滤结果的MySQL Select语句。

以下是没有where字段的示例输出:

DateHour            HSDownCount
------------------- ------------
2018-03-02 13:00:00 1   
2018-03-02 14:00:00 0   
2018-03-02 15:00:00 0   
2018-03-02 16:00:00 0   
2018-03-02 17:00:00 1   
2018-03-02 18:00:00 0   
2018-03-02 19:00:00 2   
2018-03-02 20:00:00 0   
2018-03-02 21:00:00 1   
2018-03-02 22:00:00 0   
2018-03-02 23:00:00 0   
2018-03-03 0:00:00  0   
2018-03-03 1:00:00  1   
2018-03-03 2:00:00  0   
2018-03-03 3:00:00  0   
2018-03-03 4:00:00  0   
2018-03-03 5:00:00  0   
2018-03-03 6:00:00  0   
2018-03-03 7:00:00  0   
2018-03-03 8:00:00  0   
2018-03-03 9:00:00  0   
2018-03-03 10:00:00 1   
2018-03-03 11:00:00 1   
2018-03-03 12:00:00 0   
2018-03-03 13:00:00 0   
2018-03-03 14:00:00 0   
2018-03-03 15:00:00 1   
2018-03-03 16:00:00 0

当我对DateHour使用任何类型的WHERE子句时,我收到错误...示例:

SELECT CONCAT(LEFT(DATE(EntryDateTime),10),' ',HOUR(EntryDateTime),':00:00') as DateHour, SUM(HSConnectDown) as HSDownCount
  FROM State
WHERE DateHour = '2018-03-03 11:00:00'
 GROUP 
    BY DATE(EntryDateTime),HOUR(EntryDateTime)


MySQL said:
#1054 - Unknown column 'DateHour' in 'where clause'

任何人都可以帮我吗?

2 个答案:

答案 0 :(得分:0)

在查询中将其添加为where子句。

SELECT CONCAT(LEFT(DATE(EntryDateTime),10),' ',HOUR(EntryDateTime),':00:00') as DateHour, SUM(HSConnectDown) as HSDownCount
  FROM State 
WHERE DATE('DateHour') = DATE(CONVERT_TZ(CURRENT_TIMESTAMP,'+00:00','-6:00'))
 GROUP 
    BY DATE(EntryDateTime),HOUR(EntryDateTime)

答案 1 :(得分:0)

  

CONCAT(左(日期(EntryDateTime),10),'',HOUR(EntryDateTime),':00:00')

哇,在那一行SQL中存在很多错误。给我们提供一些关于您的数据结构(特别是类型)的线索,将来可能是可取的。

  

DateHour是一个DateTime字段,格式为' YYYY-MM-DD HH:MM:SS'

不根据您在问题中发布的内容,其中表达式的别名返回字符串:

  

SELECT CONCAT(LEFT(DATE(EntryDateTime),10),'',HOUR(EntryDateTime),':00:00')as DateHour

我认为@rollstuhlfahrer真的想问一下EntryDateTime的数据类型,但是太过震惊了,不能更仔细地阅读这个问题。

让我们假装属性类型是DATETIME或TIMESTAMP然后

  SELECT CONCAT(DATE_FORMAT(EntryDateTime, '%Y-%m-%d %H'), ':00') AS dayhour
  SUM(HSConnectDown) AS HSDownCount 
  FROM State
  WHERE EntryDateTime BETWEEN
     CONVERT_TZ(
       CONCAT(CURDATE(), ' 00:00:00')
       ,'+00:00','-6:00')
     AND
     CONVERT_TZ(
       CONCAT(CURDATE(), ' 23:59:59')
       ,'+00:00','-6:00')
  GROUP BY CONCAT(DATE_FORMAT(EntryDateTime, '%Y-%m-%d %H'), ':00')

如果您想使用DATETIME或TIMESTAMP代替CURDATE(),请使用DATE_FORMAT(value, '%Y-%m-%d')

请注意,WHERE子句中谓词的右手表达式都计算为常量DATETIME值,这意味着如果有可用的查询,则此查询将使用EntryDateTime上的索引。否则它将不会比简单更快:

  SELECT CONCAT(DATE_FORMAT(EntryDateTime, '%Y-%m-%d %H'), ':00') AS dayhour
  SUM(HSConnectDown) AS HSDownCount 
  FROM State
  WHERE DATE(EntryDateTime)=CURDATE()
  GROUP BY CONCAT(DATE_FORMAT(EntryDateTime, '%Y-%m-%d %H'), ':00')