Sql-Server

SQL Server 代理 - 在每個月底使用日期變數執行查詢

  • May 13, 2020

我正在執行 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.0002012-12-31 23:59:59.999

  • 如果我們在01-02-2013 01:00:00:00,我需要這兩個日期是:

2013-01-01 00:00:00.0002013-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()));

引用自:https://dba.stackexchange.com/questions/33297