【问题标题】:How to select records based on 2 dates in mysql如何在mysql中根据2个日期选择记录
【发布时间】:2016-10-22 08:50:15
【问题描述】:

我有一张表 tbl_remit。

|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_ap2015 并选择 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 格式只有月和年?

谢谢。

【问题讨论】:

  • 您应该使用Date 数据类型来存储日期。
  • 数量50.00出现在预期结果集中的逻辑是什么?
  • 我有72,000条雇主汇款记录。我们需要知道在 2015 年以下的适用期限内,所有 PRIVATE 公司支付了多少汇款。这只是一个例子。我应该为示例添加更多记录吗?
  • 您的 ap_from 和 ap_to 列的类型是什么?我认为这些不是日期,因为 12/2015 在您的结果中不是日期格式
  • 数据类型为varchar

标签: mysql sql date group-by where-clause


【解决方案1】:

正如@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

【讨论】:

  • 是的,我做到了。抱歉,我先清理一下我的记录。但是谢谢你这个先生:)
  • 先生,GROUP BY Emp_Loc, Emp_Cat 背后的原因是什么?
  • 如果要选择Emp_Cat,它必须出现在GROUP BY 子句中,或者必须在聚合函数中。我选择了前者,因为这似乎最有意义。
【解决方案2】:

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

【讨论】:

  • 似乎 ap_from 和 ap_to 是 Not DATE 类型
  • 是的,它不是。我会先清理我的记录并使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
相关资源
最近更新 更多