Sql-Server
SQL Server 代理 - 在每個月底使用日期變數執行查詢
我正在執行 SQL Server 2008 R2,我需要創建一個新作業,該作業基本上將在每個月初(每月 1 日凌晨 01:00)執行查詢。
這是查詢:
INSERT INTO [SupportTracker].[dbo].[DashboardRecords] SELECT [bg_id] ,[bg_short_desc] ,[bg_reported_date] ,[bg_status_updated_date] ,[us_firstname] ,[us_lastname] ,[LastUpdatedUserFirstname] ,[LastUpdatedUserLastname] ,[st_name] ,[pr_name] ,[ct_name] ,[pj_name] ,[AssignedUserFirstname] ,[AssignedUserLastname] ,[bg_project] ,[no_of_hours] ,[BugType] ,[SubType] ,[Device] ,[pj_parent_id] FROM [SupportTracker].[dbo].[ViewIssueListwBugTypeNDevice] WHERE bg_reported_date between '2012-12-01 00:00:00.000' AND '2012-12-31 23:59:59.999' AND bg_id NOT IN (SELECT bg_id FROM [SupportTracker].[dbo].[DashboardRecords]) ORDER BY bg_reported_date ASC
我的問題在於
WHERE
條款。這兩個日期必須每月更改。
- 如果我們在
01-01-2013 01:00:00:00
,我需要這兩個日期是:
2012-12-01 00:00:00.000
和2012-12-31 23:59:59.999
- 如果我們在
01-02-2013 01:00:00:00
,我需要這兩個日期是:
2013-01-01 00:00:00.000
和2013-01-31 23:59:59.999
。基本上我需要擷取部分數據庫並將其保存在表中,就像每個月底一樣……
謝謝
BETWEEN
由於我在這篇博文中概述的原因,您不想使用來滿足此查詢:相反,您需要一個開放式日期範圍。從相關月份的第一天開始,小於下個月。要確定給定日期的月份的第一天,您可以執行以下操作:
SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0);
要獲得下個月的第一天,只需添加一個:
SELECT DATEADD(MONTH, 1+DATEDIFF(MONTH, 0, GETDATE()), 0);
當然,如果你想上個月只在當月的第一天,而這個月在第一個月之後,那麼你可以說:
SELECT DATEADD(MONTH, 1+DATEDIFF(MONTH, 0, DATEADD(DAY, -1, GETDATE())), 0);
因此,對於您的查詢,如果您總是希望它相對於目前月份:
... FROM SupportTracker.dbo.ViewIssueListwBugTypeNDevice AS v WHERE NOT EXISTS ( SELECT 1 FROM SupportTracker.dbo.DashboardRecords WHERE bg_id = v.bg_id ) AND v.bg_reported_date >= DATEADD(MONTH, 0, DATEDIFF(MONTH, 0, DATEADD(DAY, -1, GETDATE())) AND v.bg_reported_date < DATEADD(MONTH, 1, DATEDIFF(MONTH, 0, DATEADD(DAY, -1, GETDATE()));
或者如果你想將日期作為可選參數,你不需要減去一天,只需傳入你真正想要的月份內的任何日期(如果你傳入
NULL
,它仍然會回退到上面的公式):@Month DATE = NULL ... SET @Month = DATEADD(MONTH, 0, DATEDIFF(MONTH, 0, COALESCE(@Month, DATEADD(DAY, -1, GETDATE()))); ... FROM SupportTracker.dbo.ViewIssueListwBugTypeNDevice AS v WHERE NOT EXISTS ( SELECT 1 FROM SupportTracker.dbo.DashboardRecords WHERE bg_id = v.bg_id ) AND v.bg_reported_date >= @Month AND v.bg_reported_date < DATEADD(MONTH, 1, @Month);
但是,通常,以下方法更好地確定給定月份,因為
datediff
可能會導致問題:SELECT FirstOfThisMonth = DATEADD(DAY, 1-DAY(GETDATE()), CONVERT(date, GETDATE()));