Sql 选择跨越多个年份的语句,按跨越闰年的期间分组

Sql 选择跨越多个年份的语句,按跨越闰年的期间分组,sql,sql-server,tsql,leap-year,Sql,Sql Server,Tsql,Leap Year,我有一个查询,选择2012年11月30日之前跨越iMAXYears的所有记录: SELECT sum([AllocatedAmount]) as total, datediff(day,transactiondate,'30 Nov 2012') / DaysInyear AS YearDiff FROM tblGroups AND datediff(day,transactiondate, '30 Nov 2012') / DaysInyear < iMaxYears A

我有一个查询,选择2012年11月30日之前跨越iMAXYears的所有记录:

 SELECT sum([AllocatedAmount]) as total, 
 datediff(day,transactiondate,'30 Nov 2012') / DaysInyear AS YearDiff 
 FROM tblGroups 
 AND datediff(day,transactiondate, '30 Nov 2012') / DaysInyear < iMaxYears
 AND not transactiondate > '30 Nov 2012'  
 GROUP BY g.groupdescription, nominal, 
 datediff(day,transactiondate, '30 Nov 2012') / DaysInyear
问题是我不能通过年份(transactiondate),因为年份总是跨越2年的一部分,而Imaxyear意味着结果集中可能有4个年度


有什么想法吗?谢谢

如果用case语句代替DaysInYear变量呢

    SELECT sum([AllocatedAmount]) as total, 
 datediff(day,transactiondate,'30 Nov 2012') / CASE WHEN (year % 4 = 0 AND year % 100 <> 0) 
OR year % 400 = 0 then 366 else 365 end AS YearDiff 
 FROM tblGroups 
 AND datediff(day,transactiondate, '30 Nov 2012') / CASE WHEN (year % 4 = 0 AND year % 100 <> 0) 
OR year % 400 = 0 then 366 else 365 end < iMaxYears
 AND not transactiondate > '30 Nov 2012'  
 GROUP BY g.groupdescription, nominal, 
 datediff(day,transactiondate, '30 Nov 2012') / CASE WHEN (year % 4 = 0 AND year % 100 <> 0) 
OR year % 400 = 0 then 366 else 365 end
选择总和([AllocatedAmount])作为总计,
datediff(日期,交易日期,'2012年11月30日')/案例时间(年份%4=0,年份%100 0)
或年份%400=0,则366,否则365结束为YearDiff
来自tblGroups
和datediff(日期,交易日期,'2012年11月30日')/案例时间(年份%4=0和年份%100 0)
或年份%400=0,然后366或365结束'2012年11月30日'
按g分组。分组描述,标称,
datediff(日期,交易日期,'2012年11月30日')/案例时间(年份%4=0,年份%100 0)
或年份%400=0,然后366或365结束

只要一年中天数的值是基于所讨论的交易日期,您就应该清楚。

如果从交易日期减去29天10个月,您可以将截止点移到1月1日。通过这种方式,DATEADD为您计算正确的天数

CREATE FUNCTION yearDiff(@maxDate DATE, @transactionDate DATE)
RETURNS INT AS
BEGIN
  DECLARE @dayDiff INT
  DECLARE @monthDiff INT

  -- Determine how many months and days @maxDate is from the first of january
  SET @monthDiff = 1 - DATEPART(MONTH, @maxDate)
  SET @dayDiff = 1 - DATEPART(DAY, @maxDate)

  -- Determine how many years away from @maxDate the transaction is
  RETURN DATEDIFF(YEAR,
                  DATEADD(MONTH,
                          @monthDiff,
                          DATEADD(DAY,
                                  @dayDiff,
                                  @transactionDate)
                          ),
                  @maxDate
                  )
END
我认为您的选择将如下所示:

SELECT
  sum(amount) [total],
  dbo.yearDiff(@maxDate, transactionDate) [yearDiff]
FROM tblGroups
WHERE  transactionDate <= @maxDate
AND dbo.yearDiff(@maxDate, transactionDate) <= @iMaxYears
GROUP BY dbo.yearDiff(@maxDate, transactionDate)
选择
总额(金额)[合计],
dbo.yearDiff(@maxDate,transactionDate)[yearDiff]
来自tblGroups

如果交易日期是3年或4年,那么daysinyear是以当前年份为基础的,对吗?或者它有3年或4年的时间
CREATE FUNCTION yearDiff(@maxDate DATE, @transactionDate DATE)
RETURNS INT AS
BEGIN
  DECLARE @dayDiff INT
  DECLARE @monthDiff INT

  -- Determine how many months and days @maxDate is from the first of january
  SET @monthDiff = 1 - DATEPART(MONTH, @maxDate)
  SET @dayDiff = 1 - DATEPART(DAY, @maxDate)

  -- Determine how many years away from @maxDate the transaction is
  RETURN DATEDIFF(YEAR,
                  DATEADD(MONTH,
                          @monthDiff,
                          DATEADD(DAY,
                                  @dayDiff,
                                  @transactionDate)
                          ),
                  @maxDate
                  )
END
SELECT
  sum(amount) [total],
  dbo.yearDiff(@maxDate, transactionDate) [yearDiff]
FROM tblGroups
WHERE  transactionDate <= @maxDate
AND dbo.yearDiff(@maxDate, transactionDate) <= @iMaxYears
GROUP BY dbo.yearDiff(@maxDate, transactionDate)