MySQL:按子串搜索

时间:2016-10-03 07:56:12

标签: mysql substring greatest-n-per-group

我有一个数据库表,如下所示:

Datum_Dag           | kWh_Dag
-----------------------------
2016-10-03 08:35:00 | 0.005
2016-10-03 08:30:00 | 0.004

2016-10-02 19:15:00 | 19.019
2016-10-02 19:10:00 | 19.019
2016-10-02 19:05:00 | 19.015
2016-10-02 19:00:00 | 19.011
2016-10-02 18:55:00 | 19.004

如您所见,每天的最后一个条目包含当天收集的能量总和。我想在一系列天(例如上周)中检索这些每日价值。由于日期也包含时间,我正在使用正确的查询语句。

行“Datum_Dag”的类型为“datetime”。

我试过了:

SELECT
    Datum_Dag,
    SUBSTRING(
        `Datum_Dag`,
        1,
        10
    ) AS this_will_be_grouped,
    MAX(kWh_Dag)
FROM
    `tgeg_dag`
WHERE
    this_will_be_grouped > DATE_SUB(NOW(),INTERVAL 1 WEEK)
GROUP BY
    this_will_be_grouped

但日期范围不起作用。

有什么想法吗?

非常感谢!

3 个答案:

答案 0 :(得分:1)

请试一试:

SELECT
    DATE(Datum_Dag) AS this_will_be_grouped,
    MAX(kWh_Dag)
FROM
    `tgeg_dag`
WHERE
    Datum_Dag > DATE_SUB(CURDATE(),INTERVAL 1 WEEK)
GROUP BY
    this_will_be_grouped

注意:

  • Alias不能在同一选择语句的where子句中引用。

  • Date(timestamp)返回日期部分

  • DATE_SUB(CURDATE(),INTERVAL 1 WEEK)会在一天内返回相同的date

  • DATE_SUB(NOW(),INTERVAL 1 WEEK)每一秒都会返回不同的timestamp

答案 1 :(得分:0)

归因于Where

你应该使用

where SUBSTRING(`Datum_Dag`,1,10) > DATE_SUB(NOW(),INTERVAL 1 WEEK)
or 
Where Datum_Dag > DATE_SUB(NOW(),INTERVAL 1 WEEK)

而不是使用SUBSTRING,您最好使用cast(Datum_Dag as date)转换为日期格式。

答案 2 :(得分:0)

如果kWh_Dag可能会下降(即能否收集负能量?)那么您应该获得每天的最后一条记录,然后获得该记录的能量。

使用子查询获取每天最新记录的日期/时间,然后将其加入表中以获取该记录的详细信息: -

SELECT b.Datum_Dag,
    a.the_day,
    b.kWh_Dag
FROM
(
    SELECT DATE(Datum_Dag) AS the_day, MAX(Datum_Dag) AS max_date_time
    FROM `tgeg_dag`
    WHERE Datum_Dag > DATE_SUB(NOW(),INTERVAL 1 WEEK)
    GROUP BY the_day
) sub0
INNER JOIN `tgeg_dag` b
ON sub0.max_date_time = b.Datum_Dag