Sql 选择跨越多个年份的语句,按跨越闰年的期间分组
我有一个查询,选择2012年11月30日之前跨越iMAXYears的所有记录: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
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)