2011-08-26 13 views
6

vorrei questa query per essere in grado di conoscere automagically di oggi ora data & così come il primo dell'anno (o mese) (o settimana) ...SQL Query per YTD, MTD, WTD ammonta

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

So che userà lo GETDATE() in qualche modo, ma tu non vuoi vedere quello che ho scoperto, lo prometto!

Ecco quello che stavo leggendo sul GETDATE()MDSN: GETDATE(Transact-SQL)

Mi guardai intorno qui e Google - e non ho trovato nulla 'pulito' - in modo che qualsiasi ingresso sarebbe fantastico!

+0

Vuoi i totali per tutti e tre nella stessa query? Cosa significa per te il primo giorno della settimana? –

+0

Ci scusiamo - non ci sono tre query diverse, obiettivo simile che è tutto ... Il primo giorno della settimana (per questo) è domenica. – Fuginator

+0

Oh, e per essere più chiari, voglio COUNT() la colonna TicketID ... – Fuginator

risposta

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 è il primo giorno di SQL Server della settimana, che per impostazione predefinita alla Domenica se si utilizza inglese americano.

+0

Perfetto, grazie! – Fuginator

+0

non sai perché dichiarare una variabile qui quando puoi semplicemente mettere il getdate() dove è @now? DATEADD (yy, DATEDIFF (yy, 0, getdate()), 0) AS FirstDayOfYear, – donviti

2

Per il primo giorno della settimana può essere un po 'complicato, a seconda delle esigenze effettive (se si desidera obbedire o meno all'impostazione data dall'utente, utilizzare domenica indipendentemente dall'impostazione, ecc.), Vedere questa domanda : Get first day of week in SQL Server. Ecco un modo per farlo:

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; 

Qualsiasi cosa si sta cercando, è possibile utilizzare nella query, ad es. per YTD si usa:

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

Non davvero che è necessario la parte < della query, se si sta cercando di ottenere un conteggio fino a questo momento. Quanti biglietti saranno stati ritirati domani se sto eseguendo la query oggi? Se si desidera proteggere se stessi contro che è possibile utilizzare:

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

si potrebbe rendere un po 'più dinamica e passare un parametro che dice 'inizio anno', 'MTD' o 'WTD', ad esempio,

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

Grazie per l'input – Fuginator