如何根据mysql中的2个日期来选择记录

问题描述:

我有一个表tbl_remit。如何根据mysql中的2个日期来选择记录

|RemitNo|id|emp|emp_loc| emp_cat |ap_from| ap_to |amount| 
| 1 |1 | a | PAL | PRIVATE |12/2015|12/2015| 50.00| 
| 2 |1 | a | PAL | PRIVATE |01/2016|01/2016|100.00| 
| 3 |1 | a | PAL | PRIVATE |02/2016|02/2016|100.00| 
| 4 |2 | b | BTG |GOVERNMENT|01/2016|01/2016|200.00| 
| 5 |2 | b | BTG |GOVERNMENT|02/2016|02/2016|200.00| 
| 6 |3 | c | MAR | PRIVATE |12/2015|12/2015| 50.00| 
| 7 |3 | c | MAR | PRIVATE |01/2016|01/2016|100.00| 
| 8 |3 | c | MAR | PRIVATE |02/2016|02/2016|100.00| 

我需要创建一个view_ap2015below,并从2015年及以下,其中emp_cat是私人和emp_loc组选择它的所有汇款的总/总和。

我需要得到这张表。

|emp_loc| emp_cat |amount| 
| PAL | PRIVATE | 50.00| 
| MAR | PRIVATE | 50.00| 

我用这个声明,但2016年汇款仍然存在。

SELECT Emp_loc, Emp_Cat, FORMAT(SUM(Amount),2) As Amount 
FROM tbl_remit 
WHERE AP_from <= '01/01/2015' AND AP_To <= '01/01/2015' AND Emp_Cat = 'PRIVATE' 
GROUP BY Emp_Loc 

是因为日期的AP_From和AP_To格式只有月和年?

谢谢。

+4

你应该使用'Date'数据类型来存储日期。 –

+1

预期结果集中出现金额“50.00”的逻辑是什么? –

+0

我有72,000条雇主汇款记录。我们需要知道所有PRIVATE公司在2015年的适用期限内支付了多少汇款。这只是一个例子。我应该为示例添加更多记录吗? – Clorae

正如@Giorgos指出的那样,您似乎使用文本类型而不是日期类型来存储日期。 从来没有这样做。但是,既然您已有,则可以使用STR_TO_DATE在进行比较时将文本转换为日期。

您遇到的另一个问题是您在GROUP BY查询中选择了非聚合列。

SELECT Emp_loc, Emp_Cat, FORMAT(MIN(Amount),2) As Amount 
FROM tbl_remit 
WHERE STR_TO_DATE(AP_from, '%m/%Y') <= '2015-01-01' AND 
     STR_TO_DATE(AP_to, '%m/%Y') <= '2015-01-01' AND 
     Emp_Cat = 'PRIVATE' 
GROUP BY Emp_Loc, Emp_Cat 
+0

是的,我做过。对不起,我会先清理我的记录。但谢谢你这位先生:) – Clorae

+0

先生,这是什么原因背后的GROUP BY Emp_Loc,Emp_Cat? – Clorae

+1

如果要选择Emp_Cat,它必须出现在GROUP BY子句中,或者它必须位于聚合函数内。我选择了前者,因为这似乎是最有意义的。 –

ap_from和ap_to是DATE类型吗? 然后试试这个

SELECT Emp_loc, Emp_Cat, FORMAT(SUM(Amount),2) As Amount 
FROM tbl_remit 
WHERE YEAR(AP_from) = 2015 AND YEAR(AP_To) = 2015 AND Emp_Cat = 'PRIVATE' 
GROUP BY Emp_Loc 
+1

似乎ap_from和ap_to是**不是**日期类型 – Sami

+0

是的它不是。我会先清理我的记录并使用它。 – Clorae