查询小于给定日期的所有日期(月和年)

Posted

技术标签:

【中文标题】查询小于给定日期的所有日期(月和年)【英文标题】:Query all dates less than the given date (Month and Year) 【发布时间】:2016-01-21 04:27:40 【问题描述】:

我有一张桌子:tblperson

tblperson 一共有三列

id             amort_date        total_amort
C000000004     12/30/2015        4584.00
C000000004     01/31/2016        4584.00
C000000004     02/28/2016        4584.00

用户必须提供账单日期@bill_date

无论日期如何,我想将所有小于用户给出的日期的总摊销按月和年相加

例如

 @bill_date = '1/16/2016'

 Result should:

 ID            sum_total_amort
 C000000004    9168.00

无论是哪一天,我都想在 2016 年 1 月之前汇总所有摊销

这是我的查询,但它只计算 2016 年 1 月的日期,它不包括小于它的日期:

 DECLARE @bill_date DATE
 SET @bill_date='1/20/2016'

 DECLARE @month AS INT=MONTH(@bill_date)
 DECLARE @year AS INT=YEAR(@bill_date)

 SELECT id,sum(total_amort)as'sum_total_amort' FROM webloan.dbo.amort_guide
 WHERE loan_no='C000000004'
 AND MONTH(amort_date) = @month  
 AND YEAR(amort_date) = @year

 GROUP BY id

【问题讨论】:

【参考方案1】:

你会使用聚合和不等式:

select id, sum(total_amort)
from webloan.dbo.amort_guide
where loan_no = 'C000000004' and
      year(amort_date) * 12 + month(amort_date) <= @year * 12 + @month
group by id;

或者,在 SQL Server 2012+ 中,您可以只使用 EOMONTH()

select id, sum(total_amort)
from webloan.dbo.amort_guide
where loan_no = 'C000000004' and
      amort_date <= EOMONTH(@bill_date)
group by id;

【讨论】:

【参考方案2】:

您可以使用以下方法获取月初:

DATEADD(MONTH, DATEDIFF(MONTH, 0, @bill_date), 0)

所以要获得SUM(total_amort),您的查询应该是:

SELECT 
    id,
    SUM(total_amort) AS sum_total_amort
FROM webloan.dbo.amort_guide
WHERE 
    loan_no='C000000004'
    AND amort_date < DATEADD(MONTH, DATEDIFF(MONTH, 0, @bill_date) + 1, 0)

【讨论】:

【参考方案3】:

你正在检查

AND MONTH(amort_date) < @month  
AND YEAR(amort_date) < @year

因此查询将只返回MONTH(amort_date)=MONTH(input_variable) AND YEAR(amort_date)=YEAR(input_variable) 的结果

试试这个 声明@bill_date DATE SET @bill_date='1/20/2016'

 DECLARE @month AS INT=MONTH(@bill_date)
 DECLARE @year AS INT=YEAR(@bill_date)

 SELECT id,sum(total_amort)as'sum_total_amort' FROM webloan.dbo.amort_guide
 WHERE loan_no='C000000004'
 AND MONTH(amort_date) < @month  
 AND YEAR(amort_date) < @year

 GROUP BY id

【讨论】:

以上是关于查询小于给定日期的所有日期(月和年)的主要内容,如果未能解决你的问题,请参考以下文章

如何将日、月和年添加到赛普拉斯中的选定日期

LINQ:在日期时间字段中按月和年分组

Excel确定现有日期的上一个月和年

Drupal 视图 UI,过滤器暴露,集合字段内容中的日期仅按月和年(无天)

仅用月和年更改日期格式

如何在 Jooq 中按月和年将毫秒翻译成日期和分组?