仅查询当月的数据

时间:2013-03-19 15:58:14

标签: sql tsql sql-server-2005 ssms

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

select   ProjectNo,
         CostCat,
         SummaryCostCat,
         CreditorEmployeeName,
         UnitCost,
         TotalCost,
         TransactionDate
from dbo.NGPCostPosition

这为我提供了以下数据选择:

enter image description here

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

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

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

enter image description here

其中CurrentValue代表当月数据。

3 个答案:

答案 0 :(得分:12)

这将使用索引,与“技巧”不同,将日期时间转换为字符串,然后重新定义,或者使用DATEPART对齐列。

WHERE TransactionDate >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)
AND TransactionDate < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())+1, 0);

整洁?

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;

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

CurrentValue = CASE 
  WHEN TransactionDate >= @ms AND TransactionDate < @me
  THEN TotalCost END

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

答案 1 :(得分:0)

您可以使用DATEPART功能检查月份和年份:

WHERE DATEPART(month, GETDATE()) = DATEPART(month, Date)) 
AND (DATEPART(year, GETDATE()) = DATEPART(year, Date)

答案 2 :(得分:0)

select   ProjectNo,
         CostCat,
         SummaryCostCat,
         CreditorEmployeeName,
         UnitCost,
         TotalCost,
         TransactionDate,
         CASE WHEN DATEPART(month, TransactionDate) = DATEPART(month, GETDATE()) AND
                   DATEPART(year, TransactionDate) = DATEPART(year, GETDATE()) THEN
                     TotalCost
               ELSE NULL
          END AS CurrentValue
from dbo.NGPCostPosition