2011-08-26 857 views
6

我想这个查询能够自动地知道今天的日期&时间,以及第一年(或月)(或周)...SQL查询YTD,MTD,WTD总计

SELECT TicketID 
FROM Ticket 
WHERE  (Ticket.DtCheckOut > '1/1/2011 12:00:00 AM') 
     AND (Ticket.DtCheckOut < '8/27/2011 12:00:00 AM') 

我知道它会以某种形式使用GETDATE(),但你不想看到我想出的,我保证!

这是我在读上GETDATE()MDSN: GETDATE(Transact-SQL)

我看在这里和谷歌 - 并没有发现任何东西“干净” - 所以任何输入将是真棒!

+0

你想在同一个查询中的所有三个总数?对你而言,第一天是什么意思? –

+0

对不起 - 没有三个不同的查询,所有类似的目标...星期一(为此)是星期天。 – Fuginator

+0

呵呵,并且更加清楚,我想COUNT()TicketID列... – Fuginator

回答

4
DECLARE @now DATETIME 
SET @now = GETDATE() 

SELECT 
    DATEADD(yy, DATEDIFF(yy, 0, @now), 0) AS FirstDayOfYear, 
    DATEADD(mm, DATEDIFF(mm, 0, @now), 0) AS FirstDayOfMonth, 
    DATEADD(DAY, -DATEDIFF(dd, @@DATEFIRST - 1, @now) % 7, @now) AS FirstDayOfWeek 

@@DATEFIRST是SQL Server的一周,如果您正在使用美国英语默认为周日的第一天。

+0

完美,谢谢! – Fuginator

+0

不确定为什么在这里声明一个变量时,你可以把getdate()放在@now所在的位置? DATEADD(yy,DATEDIFF(yy,0,getdate()),0)AS FirstDayOfYear, – donviti

2

根据您的实际需求(无论您是否遵守用户的日期优先设置,使用星期日而不考虑设置等),对于每周的第一天,可能会有点棘手,请参阅此问题:Get first day of week in SQL Server。这里有一种方法:

DECLARE 
    @today DATE = CURRENT_TIMESTAMP, 
    @y DATE, 
    @m DATE, 
    @w DATE; 

SELECT 
    @y = DATEADD(YEAR, DATEDIFF(YEAR, 0, @today), 0), 
    @m = DATEADD(MONTH, DATEDIFF(MONTH, 0, @today), 0), 
    @w = DATEADD(DAY, 1-DATEPART(WEEKDAY, @today), @today); 

SELECT 
    [First day of year] = @y, 
    [First day of month] = @m, 
    [First day of week] = @w; 

无论你在哪一个人之后,你都可以在查询中使用,例如,为YTD你可以使用:

SELECT TicketCount = COUNT(TicketID) 
    FROM dbo.Ticket 
    WHERE DtCheckOut >= @y; 

真的不认为你需要查询的<部分,如果你想获得数到现在。如果我今天正在运行查询,明天将签出多少张门票?如果你想保护自己免受您可以使用:

SELECT COUNT(TicketID) 
    FROM dbo.Ticket 
    WHERE DtCheckOut >= @y 
    AND DtCheckOut < DATEADD(DAY, 1, @now); 

你可以让它多了几分活力和传递,上面写着“YTD”,“MTD”或“WTD”,例如参数

CREATE PROCEDURE dbo.CountTickets 
    @Range CHAR(3) = 'YTD' 
AS 
BEGIN 
    SET NOCOUNT ON; 

    -- you may want to handle invalid ranges, e.g. 
    IF @Range NOT IN ('YTD', 'MTD', 'WTD') 
    BEGIN 
     RAISERROR('Please enter a valid range.', 11, 1); 
     RETURN; 
    END 

    DECLARE 
     @today DATE = CURRENT_TIMESTAMP, 
     @start DATE; 

    SELECT 
     @start = CASE @range 
      WHEN 'YTD' THEN DATEADD(YEAR, DATEDIFF(YEAR, 0, @today), 0) 
      WHEN 'MTD' THEN DATEADD(MONTH, DATEDIFF(MONTH, 0, @today), 0) 
      WHEN 'WTD' THEN DATEADD(DAY, 1-DATEPART(WEEKDAY, @today), @today) 
    END; 

    SELECT 
     Range  = @range, 
     TicketCount = COUNT(TicketID) 
    FROM dbo.Ticket 
    WHERE dtCheckOUt >= @start; 
END 
GO 
+0

感谢您的输入 – Fuginator