[英]SQL Query for YTD, MTD, WTD totals
我希望這個查詢能夠自動地知道今天的日期和時間以及一年(或一個月)(或一周)的第一天......
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)
我環顧四周和谷歌 - 並沒有找到任何'干凈' - 所以任何輸入都會很棒!
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的一周中的第一天,如果您使用的是美國英語,則默認為星期日。
對於一周的第一天,它可能有點棘手,取決於您的實際要求(無論您是否要遵守用戶的datefirst設置,無論設置如何都使用星期日等),請參閱此問題: 獲取第一天在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;
如果你現在正試圖計算,那么你真的認為你不需要查詢的<部分。 如果我今天運行查詢,明天會檢出多少張票? 如果你想保護自己免受攻擊,你可以使用:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.