仅查询当月的数据

use*_*159 1 sql t-sql ssms sql-server-2005

我有一个简单的SQL查询如下:

select   ProjectNo,
         CostCat,
         SummaryCostCat,
         CreditorEmployeeName,
         UnitCost,
         TotalCost,
         TransactionDate
from dbo.NGPCostPosition
Run Code Online (Sandbox Code Playgroud)

这给了我一些数据如下:

在此输入图像描述

我想要做的是在我的数据中创建一个名为"CurrentValue"的新列,该列将根据当前月份的交易日期计算每个TotalCost值.

理想情况下,这会随着我进入新的月份而改变.

这方面的一个例子如下图: -

在此输入图像描述

其中CurrentValue代表当月数字.

Aar*_*and 12

这将使用索引,与"技巧"不同,将日期时间转换为字符串然后再转换为日期,或者使用DATEPART针对您的列.

WHERE TransactionDate >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)
AND TransactionDate < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())+1, 0);
Run Code Online (Sandbox Code Playgroud)

整洁的?

DECLARE @ms SMALLDATETIME, @me SMALLDATETIME;
SET @ms = DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0);
SET @me = DATEADD(MONTH, 1, @ms);

SELECT
...
WHERE TransactionDate >= @ms AND TransactionDate < @me;
Run Code Online (Sandbox Code Playgroud)

随着需求的不断变化,如何使用上面显示的@ms/@ me变量,然后:

CurrentValue = CASE 
  WHEN TransactionDate >= @ms AND TransactionDate < @me
  THEN TotalCost END
Run Code Online (Sandbox Code Playgroud)

另请注意,TransactionDate如果要执行某种聚合,则不应该在分组列中.如果您向我们展示您真正想要的结果,我们可以编写您的整个查询 - 您在第一眼看到的列列表和分组确实没有意义,因此根据您的实际问题我模糊了那些因此我们可以专注于实际WHERE条款.