SQL查询YTD、MTD、WTD总计

SQL查询YTD、MTD、WTD总计,sql,sql-server,date,select,sql-server-2008-r2,Sql,Sql Server,Date,Select,Sql Server 2008 R2,我希望这个查询能够自动知道今天的日期和时间以及一年(或月)(或周)的第一个 选择TicketID 从票上 其中(Ticket.DtCheckOut>'2011年1月1日12:00:00 AM') 和(Ticket.DtCheckOut

我希望这个查询能够自动知道今天的日期和时间以及一年(或月)(或周)的第一个

选择TicketID
从票上
其中(Ticket.DtCheckOut>'2011年1月1日12:00:00 AM')
和(Ticket.DtCheckOut<'8/27/2011 12:00:00 AM')
我知道它会以某种形式使用
GETDATE()
,但我保证,你不会想看到我的想法

下面是我在
GETDATE()上读到的内容

我在这里和谷歌搜索了一下,没有发现任何“干净”的东西,所以任何输入都会很棒

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

是SQL Server一周中的第一天,如果您使用的是美国英语,则默认为星期天。

对于一周中的第一天,可能会有点棘手,具体取决于您的实际需求(无论您是否希望遵守用户的datefirst设置,无论设置如何,都使用Sunday等),请参见以下问题:。以下是一种方法:

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);

您想在同一查询中获得所有三个的总数吗?还有,一周的第一天对你意味着什么?对不起,没有三个不同的问题,类似的目标,仅此而已。。。一周的第一天是星期天。哦,更清楚地说,我想数一数()TicketID列…不知道为什么要在这里声明一个变量,而你可以把getdate()放在@now的位置?DATEADD(yy,DATEDIFF(yy,0,getdate()),0)作为一年的第一天,
SELECT COUNT(TicketID)
    FROM   dbo.Ticket
    WHERE  DtCheckOut >= @y
    AND    DtCheckOut < DATEADD(DAY, 1, @now);
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