【问题标题】:Calculate Date Months SQL计算日期月份 SQL
【发布时间】:2014-06-03 20:28:10
【问题描述】:

我想弄清楚的是如何自动计算每个月从过去 4 个月到当前月份的资助日期总数。例如,因为现在是六月,我想要二月、三月、四月和五月的资金账户。这是我现在拥有的编解码器,似乎无法弄清楚。

DECLARE @Year int

set @Year = 2013

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) February
   , 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
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 
   a.dealer_code = '0003594' and YEAR(c.Funded_date) = @Year
GROUP BY
   d.name,
   a.dealer_code,
   b.last_name,
   b.city, b.state, b.phone

【问题讨论】:

  • 如果现在是 2 月,您是只想要 1 月,还是去年 10 月 + 11 月 + 12 月 + 1 月?
  • 什么不适合你?这段代码看起来不错,您只是不确定如何将其限制为最近 4 个月?
  • 您使用的是什么数据库提供程序?数据库服务器?甲骨文?请解释如果前四个月将跨入上一年,查询应该如何工作。为什么在提及当前时间时使用@Year 参数。月份应该作为参数传入还是使用 SYSDATE/GETDATE() 检索?
  • 我正在使用 MySQL 服务器 2008 R2。另外@GoatCo 我想要本月过去的 4 个月。所以现在是六月,所以我想要二月、三月、四月和五月的资金账户。我希望 Date 函数能够自动知道每次用户输入日期。

标签: sql calculated-columns


【解决方案1】:

如果您只想弄清楚如何将其限制为过去 4 个月(假设是 SQL Server),您可以将 WHERE 标准更改为:

WHERE a.dealer_code = '0003594' 
  AND YEAR(c.Funded_date) = @Year
  AND c.Funded_date >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-4, 0) 
  AND c.Funded_date < DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-1, 0)

【讨论】:

    【解决方案2】:

    您没有提供太多信息或回答 cmets 中的问题,这是我的最佳猜测:

    SELECT
       d.name, a.dealer_code, b.last_name, b.city, b.state, b.phone, 
       MONTH(c.FundedDate), 
       COUNT(c.FundedDate) as RecordCount
    
    FROM 
       {... same as existing ...}
    
    WHERE 
       a.dealer_code = '0003594' and YEAR(c.Funded_date) = @Year
       and MONTH(GETDATE()) - MONTH(c.FundedDate) between 1 and 4
    
    GROUP BY
       d.name,
       a.dealer_code,
       b.last_name,
       b.city, b.state, b.phone,
       MONTH(c.FundedDate)
    

    【讨论】:

    • 我同意,但是我向 OP 询问了这一点(见第一条评论)但没有得到答复......他已经在 WHERE 子句中匹配了 YEAR,如果现在对他来说足够好我我不打算争论这一点。
    【解决方案3】:

    试试这个,可能有语法错误。

    DECLARE @CurrentMonth int
    
    SET @CurrentMonth = MONTH(GETDATE())
    
    
    SELECT  
       d.name, a.dealer_code, b.last_name, b.city, b.state, b.phone
       , COUNT(CASE WHEN  MONTH(c.Funded_date) = @CurrentMonth THEN 1 ELSE NULL END) CurrentMonth
       , COUNT(CASE WHEN  MONTH(DATEADD(M,1,c.Funded_date)) = @CurrentMonth THEN 1 ELSE NULL END) PrevMonth
       , COUNT(CASE WHEN  MONTH(DATEADD(M,2,c.Funded_date)) = @CurrentMonth  THEN 1 ELSE NULL END) CurrentMonth-2
       , COUNT(CASE WHEN  MONTH(DATEADD(M,3,c.Funded_date)) = @CurrentMonth THEN 1 ELSE NULL END) CurrentMonth-3
    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 
       a.dealer_code = '0003594' and DATEDIFF(M, c.Funded_date, GETDATE()) <= 4
    GROUP BY
       d.name,
       a.dealer_code,
       b.last_name,
       b.city, b.state, b.phone
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      相关资源
      最近更新 更多