2011-08-26 39 views
6

Tôi muốn truy vấn này để có thể Automagically biết thời gian ngày & ngày nay cũng như là người đầu tiên của năm (hoặc tháng) (hoặc tuần) ...SQL Query cho YTD, MTD, đục thân tổng số

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

Tôi biết nó sẽ sử dụng GETDATE() dưới một số hình thức, nhưng bạn không muốn thấy những gì tôi đã đưa ra, tôi hứa!

Dưới đây là những gì tôi đã đọc trên GETDATE()MDSN: GETDATE(Transact-SQL)

Tôi nhìn quanh đây và Google - và không tìm thấy bất cứ điều gì 'sạch' - vì vậy bất kỳ đầu vào sẽ là tuyệt vời!

+0

Bạn muốn tổng số cho cả ba trong cùng một truy vấn? Ngoài ra, ngày đầu tiên trong tuần có ý nghĩa gì đối với bạn? –

+0

Xin lỗi - không có ba truy vấn khác nhau, mục tiêu tương tự là tất cả ... Ngày đầu tiên trong tuần (cho điều này) là chủ nhật. – Fuginator

+0

Ồ, và để rõ ràng hơn, tôi muốn COUNT() cột TicketID ... – Fuginator

Trả lời

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 là ngày đầu tiên của SQL Server trong tuần, mặc định là Chủ Nhật nếu bạn đang sử dụng tiếng Anh Mỹ.

+0

Hoàn hảo, cảm ơn! – Fuginator

+0

không chắc chắn lý do tại sao khai báo một biến ở đây khi bạn chỉ có thể đặt getdate() trong đó @now là? DATEADD (yy, DATEDIFF (yy, 0, getdate()), 0) AS FirstDayOfYear, – donviti

2

Ngày đầu tiên trong tuần có thể hơi phức tạp, tùy thuộc vào yêu cầu thực tế của bạn (cho dù bạn muốn tuân theo cài đặt ngày đầu tiên của người dùng hay không, sử dụng Chủ nhật bất kể cài đặt, v.v.), xem câu hỏi này : Get first day of week in SQL Server. Dưới đây là một cách để thực hiện:

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; 

Cho dù bạn chọn ai sau đó, bạn có thể sử dụng trong truy vấn, ví dụ: cho YTD, bạn sẽ sử dụng:

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

Đừng nghĩ rằng bạn cần số < truy vấn nếu bạn đang cố gắng đếm ngược ngay bây giờ. Có bao nhiêu vé sẽ được kiểm tra vào ngày mai nếu tôi đang chạy truy vấn hôm nay? Nếu bạn muốn bảo vệ mình chống lại mà bạn có thể sử dụng:

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

Bạn có thể làm cho nó năng động hơn một chút và vượt qua trong một tham số nói rằng 'YTD', 'MTD' hoặc 'đục thân', ví dụ

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

Cảm ơn bạn đã nhập – Fuginator