我有两列brand
和date_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)
结果:
现在这里是混乱的部分。如何使用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。提前谢谢。
答案 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'
...
";
如果你不想用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`