【问题标题】:Sum of all column name of specific string dates特定字符串日期的所有列名的总和
【发布时间】:2018-10-05 07:17:28
【问题描述】:

我有一个表格,我想在其中获取特定日期列的总价格。日期是字符串(eg: January 2018)。我尝试的是将字符串转换为日期。

SELECT
    SUM(price_amount) as 'total_paid',
    STR_TO_DATE(CONCAT('01 ',price_month), "%M %d %Y") as dates
FROM user_prices
WHERE price_type = 'cash' AND price_month >= DATE('January 01 2018')
GROUP BY price_month
ORDER BY price_month DESC;

结果为空。我只需要获取表中日期等于或大于 2018 年 1 月 1 日的每个现有月份的总和。并且还按月对它们进行分组。

email          price_amount      price_month     price_type    date_added
1@gmail.com     200              April 2017      cash          ---
19@gmail.com    400              December 2017   cash          ---
12@gmail.com    100              January 2018    cash          ---
123@gmail.com   230              January 2018    cash          ---
1234@gmail.com  250              January 2018    credit        ---
321@gmail.com   200              April 2018      cash          ---
32@gmail.com    120              March 2018      cash          ---

所以上面的例子应该显示下面的预期结果:

price_month     total_paid
March 2018      120
April 2018      200
January 2018    330

【问题讨论】:

  • price_month 列实际上是文本,还是您只是以这种方式显示这些日期?
  • 将日期存储为日期。然后回复我们。
  • @TimBiegeleisen 它的文本 - varchar
  • 你的连接创建了一个模式'd M Y';对于您指定“M d Y”的转换(并且您使用了错误类型的引号) - 您需要使用匹配模式。

标签: mysql


【解决方案1】:

如果price_month 列实际上是您向我们展示的文字,那么您需要使用STR_TO_DATE 来使这个查询工作。请注意,STR_TO_DATE 至少需要年、月、 日信息才能生成日期。因此,在下面的查询中,我将每个月的年份数据任意构建为每月的第一天。

SELECT
    price_month,
    SUM(price_amount) AS total_paid
FROM user_prices
WHERE
    STR_TO_DATE(CONCAT('01 ', price_month), '%d %M %Y') >= '2018-01-01' AND
    price_type = 'cash'
GROUP BY
    price_month,
    STR_TO_DATE(CONCAT('01 ', price_month), '%d %M %Y')
ORDER BY
    STR_TO_DATE(CONCAT('01 ', price_month), '%d %M %Y');

Demo

今后,请不要将您的日期存储为这样的文本。通常,您可能会假设每次您必须在 MySQL 查询中使用 STR_TO_DATE 时都会撞倒一只小狗。

【讨论】:

  • 如果我将列类型更改为date,它会更改保存在数据库中的值吗?
  • @xkev 是也不是。如果您使用您绝对应该使用的真实日期,那么您将不再存储实际月份名称。但是,您可以轻松地再次使用DATE_FORMAT 生成它们,反过来,它需要一个日期来生成字符串输出。底线是你应该远离这样的存储日期。将 2018-01-01 存储为日期,而不是 January 2018
猜你喜欢
  • 1970-01-01
  • 2018-05-14
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
相关资源
最近更新 更多