2011-08-26 40 views
6

Me gustaría que esta consulta sea capaz de saber automagicamente fecha y hora & de hoy, así como la primera parte del año (o mes) (o semanas) ...de consultas SQL para el año actual, MTD, DMT asciende

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

Sé que utilizará GETDATE() de alguna forma, pero no quiere ver lo que he inventado, ¡lo prometo!

Aquí es lo que estaba leyendo en GETDATE()MDSN: GETDATE(Transact-SQL)

he mirado por aquí y Google - y no encontrar nada 'limpia' - por lo que cualquier entrada sería increíble!

+0

¿Desea los totales de los tres en la misma consulta? ¿Qué significa para ti el primer día de la semana? –

+0

Lo sentimos, no hay tres consultas diferentes, el objetivo similar es todo ... El primer día de la semana (para esto) es el domingo. – Fuginator

+0

Ah, y para ser más claro, quiero COUNT() la columna TicketID ... – Fuginator

Respuesta

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 es el primer día de la semana, que por defecto a domingo si está utilizando EE.UU. Inglés de SQL Server.

+0

Perfecto, gracias! – Fuginator

+0

no estoy seguro de por qué declarar una variable aquí cuando puedes simplemente poner getdate() donde @now es? DATEADD (yy, DATEDIFF (yy, 0, getdate()), 0) AS FirstDayOfYear, – donviti

2

Para el primer día de la semana puede ser un poco complicado, dependiendo de sus necesidades reales (si desea obedecer la configuración de la fecha del primer usuario o no, use el domingo independientemente de la configuración, etc.), vea esta pregunta : Get first day of week in SQL Server. Esta es una manera de hacerlo:

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; 

Cualquiera que usted está después, se pueden utilizar en la consulta, por ejemplo, para el año actual se debería utilizar:

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

realmente no cree necesario que la parte < de la consulta, si usted está tratando de obtener un conteo hasta ahora. ¿Cuántas entradas habrá salido mañana si estoy ejecutando la consulta hoy? Si desea protegerse contra la que se puede utilizar:

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

Usted puede que sea un poco más dinámica y pase un parámetro que dice 'que va del año', 'MTD' o 'DMD', por ejemplo,

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

Gracias por la entrada – Fuginator

Cuestiones relacionadas