针对YTD,MTD,WTD总计的SQL查询

时间:2011-08-26 23:05:00

标签: sql sql-server date select sql-server-2008-r2

我希望此查询能够自动了解今天的日期和时间。时间以及一年中的第一年(或一个月)(或一周)......

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)

上阅读的内容

我环顾四周和谷歌 - 并没有找到任何'干净' - 所以任何输入都会很棒!

2 个答案:

答案 0 :(得分: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的一周中的第一天,如果您使用的是美国英语,则默认为星期日。

答案 1 :(得分:2)

对于一周的第一天,它可能有点棘手,具体取决于您的实际要求(您是否要遵守用户的datefirst设置,无论设置如何都使用星期日等),请参阅此问题: 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;

真的不认为你需要&lt;查询的一部分,如果您正在尝试立即计数。如果我今天运行查询,明天会检出多少张票?如果你想保护自己免受攻击,你可以使用:

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