【问题标题】:SQL adding MonthsSQL 添加月份
【发布时间】:2014-05-28 15:51:43
【问题描述】:

您好,我正在尝试获取某些月份的记录。例如对于这个查询,我希望用户看到当前月份是“五月”,而过去一个月是“四月”。从那时起,我不希望我的查询在任何其他月份运行。我被这个查询困住了,无法弄清楚。基本上我需要一个函数在我的查询中自动知道这个月和前 1 个月来显示记录。谢谢

DECLARE @Year int
set @Year = 2014
SELECT d.name, a.dealer_code, b.last_name, b.city, b.state, b.phone

   , COUNT(CASE WHEN  MONTH(c.Funded_date) = 1 THEN 1 ELSE NULL END) January
   , COUNT(CASE WHEN  MONTH(c.Funded_date) = 2 THEN 1 ELSE NULL END) Feburary
   , COUNT(CASE WHEN  MONTH(c.Funded_date) = 3 THEN 1 ELSE NULL END) March
   , COUNT(CASE WHEN  MONTH(c.Funded_date) = 4 THEN 1 ELSE NULL END) April
   , COUNT(CASE WHEN  MONTH(c.Funded_date) = 5 THEN 1 ELSE NULL END) May
   , COUNT(CASE WHEN  MONTH(c.Funded_date) = 6 THEN 1 ELSE NULL END) June
   , COUNT(CASE WHEN  MONTH(c.Funded_date) = 7 THEN 1 ELSE NULL END) July
   , COUNT(CASE WHEN  MONTH(c.Funded_date) = 8 THEN 1 ELSE NULL END) August
   , COUNT(CASE WHEN  MONTH(c.Funded_date) = 9 THEN 1 ELSE NULL END) September
   , COUNT(CASE WHEN  MONTH(c.Funded_date) = 10 THEN 1 ELSE NULL END) October
   , COUNT(CASE WHEN  MONTH(c.Funded_date) = 11 THEN 1 ELSE NULL END) November
   , COUNT(CASE WHEN  MONTH(c.Funded_date) = 12 THEN 1 ELSE NULL END) December
   , COUNT(*) 'Year to Date'
   FROM tdealer a 
   JOIN tContact b ON a.contact_id = b.contact_id 
   JOIN tContract c ON a.dealer_id = c.dealer_id 
   JOIN tCompany d ON c.company_id = d.company_id
  where YEAR (c.Funded_date) = @Year
  GROUP BY d.name, a.dealer_code, b.last_name, b.city, b.state, b.phone

【问题讨论】:

  • 使用 %M 参数检查 DATE_FORMAT!
  • date and time functions of MySQL 可以为您提供当前月份,当然您可以减去一个月并得到最后一个。你被困在哪里了?
  • 您应该能够在查询中使用WHERE DATE_FORMAT(c.Funded_date, '%Y%m') BETWEEN DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -1 MONTH), '%Y%m') AND DATE_FORMAT(NOW(), '%Y%m') 之类的内容来获取当前和上个月的详细信息。

标签: mysql add time-series


【解决方案1】:

这里的诀窍是做两件事:

  1. 创建一个表达式,将任意DATETIME 转换为该日期所在月份的第一天。

  2. 在WHERE 和GROUP BY 子句中适当使用它。

表达式是

DATE_FORMAT(whatever, '%Y-%m-01')

这需要例如“2014-05-28 12:22:30”,并将其转换为“2014-05-01”。将一个有效的DATE 转换为另一个有效的DATE 真的很方便,因为这样您就可以使用 MySQL 中内置的所有好的日期算法。

因此,例如,如果您想要当前月份的前一个月的第一天,您可以使用:

DATE_FORMAT(NOW(), '%Y-%m-01') - INTERVAL 1 MONTH

这是您的查询大纲:

SELECT DATE_FORMAT(c.Funded_date, '%Y-%m-01') AS month_beginning,
       d.name, a.dealer_code, b.last_name, b.city, b.state, b.phone,
       COUNT(1) AS itemcount
  FROM tdealer a 
  JOIN tContact b ON a.contact_id = b.contact_id 
  JOIN tContract c ON a.dealer_id = c.dealer_id 
  JOIN tCompany d ON c.company_id = d.company_id
 where c.Funded_date >= DATE_FORMAT(NOW(), '%Y-%m-01') - INTERVAL 1 MONTH
   AND c.Funded_date <  DATE_FORMAT(NOW(), '%Y-%m-01') + INTERVAL 1 MONTH
 GROUP BY DATE_FORMAT(c.Funded_date, '%Y-%m-01'),
          d.name, a.dealer_code, b.last_name, b.city, b.state, b.phone
 ORDER BY d.name, a.dealer_code, b.last_name, b.city, b.state, b.phone,
          DATE_FORMAT(c.Funded_date, '%Y-%m-01')

看看你如何选择两个月的期限?从本月的前一个月的第一天开始,到下个月的第一天结束,但不包括那一天。

如何做这种事情写在http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    相关资源
    最近更新 更多