使用Date_Sub通过Aliases列减去year

时间:2014-10-26 09:18:52

标签: php mysql datetime mysqli alias

我有两列branddate_time,在选择期间我将它们分配给别名。查询如下:

SELECT brand, 
YEAR(date_time) AS 'year', 
SUM( brand = 'KFC' ) AS kfc
SUM( brand = 'PZH' ) AS pzh, 
SUM( brand = 'SUB' ) AS sub
FROM scan_report
GROUP BY YEAR(date_time)

结果:

enter image description here

现在这里是混乱的部分。如何使用Date_Sub功能仅显示过去5年的数据。我的意思是用户将输入2014,并且仅显示/选择过去5年的记录,即2010 to 2014

使用这样的WHERE给了我空记录:

SELECT  
YEAR(date_time) AS 'year', 
SUM( brand = 'KFC' ) AS kfc
SUM( brand = 'PZH' ) AS pzh, 
SUM( brand = 'SUB' ) AS sub
FROM scan_report WHERE DATE_SUB(2014, INTERVAL 5 YEAR)
GROUP BY YEAR(date_time)

或者

FROM scan_report WHERE DATE_SUB(year = 2014, INTERVAL 5 YEAR)

知道如何从过去5年的用户输入中检索记录吗?我更喜欢使用mysql解决这个问题,如果没有找到解决方案,那么我将使用php。提前谢谢。

2 个答案:

答案 0 :(得分:1)

在PHP中进行这个简单的数学运算:

$year = 2014; # from $_POST or anywhere else
$from = ($year - 4) . '-01-01 00:00:00';
$to = $year . '-12-31 23:59:59';

然后在查询中使用这两个变量。

$sql = "
    ...
    WHERE date_time BETWEEN '$from' AND '$to'
    ...
";

demo

UPDATE(在SQL中计算):

如果你不想用PHP计算,你可以在MySQL中计算:

$sql = "
    ...
    WHERE 
        date_time BETWEEN CONCAT({$year}-4, '-01-01 00:00:00') AND CONCAT({$year}, '-12-31 23:59:59')
    ...
";

更新(不关心速度或索引):

$sql = "
    ...
    WHERE 
        YEAR(date_time) AND {$year}-4 AND {$year}
    ...
";

答案 1 :(得分:1)

您的问题是WHERE子句中的谓词为每一行返回NULL,因此不返回任何行。

DATE_SUB函数将DATE表达式作为第一个参数,而不是整数。也就是说,您可以将'2014-01-01'指定为第一个参数,而不是2014。这将返回一个非零日期,它将评估为TRUE(在布尔上下文中),因此将返回所有行。

要包含特定值为date_time的行,您需要在谓词(WHERE子句)中使用比较。要返回date_time值为' 2009-01-01'的行以后......

SELECT YEAR(t.date_time)      AS year
     , SUM( t.brand = 'KFC' ) AS kfc
     , SUM( t.brand = 'PZH' ) AS pzh
     , SUM( t.brand = 'SUB' ) AS sub
  FROM scan_report t 
 WHERE t.date_time >= DATE_SUB('2014-01-01', INTERVAL 5 YEAR)
 GROUP BY YEAR(date_time)

一些附加说明:如果您需要(或想要)转义标识符(例如列名,因为它是保留字),请将标识符用反引号字符括起来,而不是单引号,例如

SELECT YEAR(`t`.`date_time`)  AS `year`