[英]Date Range Based on Today
我正在嘗試編寫一個存儲過程,該存儲過程將在每月的1號,8號,15號和22號由自動報告調用。
下面是我目前正在嘗試使用的代碼,但是我一直收到錯誤消息, Explicit conversion from data type int to date is not allowed.
如果在1號運行,則在@StartDate的行上運行。 但是,我嘗試注釋掉該部分,但遇到相同的錯誤,但接下來的@StartDate。
我需要@StartDate和@EndDate能夠根據當前正在運行報告的當月哪一天進行更改。
在22日,它應該是本月的15日到21日。
Declare @RunDate date Declare @StartDate Date Declare @EndDate Date Set @RunDate = '3/1/2017' If (Day(@RunDate) = 1) Begin Set @StartDate = Convert(Date,(Month(DATEADD(d,-1,@Rundate)) + '/21/' + Case When Month(@Rundate) = '1' Then Year(@RunDate) Else Year(DATEADD(yy,-1,@Rundate)) End),101) Set @EndDate = Convert(date,DATEADD(ms,-3,DATEADD(mm,0,DATEADD(mm,DATEDIFF(mm,0,@Rundate),0))),101) End Else IF (Day(@RunDate) = 8) Begin Set @StartDate = Convert(Date,(Month(@Rundate) + '/1/' + Year(@RunDate)),101) Set @EndDate = Convert(Date,(Month(@Rundate) + '/7/' + Year(@RunDate)),101) End Else If (Day(@Rundate) = 15) Begin Set @StartDate = Convert(Date,(Month(@Rundate) + '/8/' + Year(@RunDate)),101) Set @EndDate = Convert(Date,(Month(@Rundate) + '/14/' + Year(@RunDate)),101) End Else If (Day(@Rundate) = 22) Begin Set @StartDate = Convert(Date,(Month(@Rundate) + '/15/' + Year(@RunDate)),101) Set @EndDate = Convert(Date,(Month(@Rundate) + '/21/' + Year(@RunDate)),101) End
我正在將SQL Server 2012后端與SSMS 2016前端一起使用。 如果有幫助。
您可以將所有內容簡化為:
Declare @RunDate date, @StartDate date, @EndDate date;
Set @RunDate = '20170301';
If (Day(@RunDate) = 1)
Begin;
Set @StartDate = dateadd(day,20,dateadd(month, datediff(month, 0, @RunDate)-1, 0))
Set @EndDate = dateadd(day,-1,dateadd(month, datediff(month, 0, @RunDate), 0))
End;
Else
If (Day(@RunDate) in (8,15,22))
Begin;
Set @StartDate = dateadd(day,Day(@RunDate)-8,dateadd(month, datediff(month, 0, @RunDate), 0))
Set @EndDate = dateadd(day,Day(@RunDate)-2,dateadd(month, datediff(month, 0, @RunDate), 0))
End;
使用case
替代方法,但不驗證8,15,22
的day()
:
Declare @RunDate date, @StartDate date, @EndDate date;
Set @RunDate = '20170328';
set @StartDate = case day(@RunDate)
when 1 then dateadd(day,20,dateadd(month, datediff(month, 0, @RunDate)-1, 0))
else dateadd(day,Day(@RunDate)-8,dateadd(month, datediff(month, 0, @RunDate), 0))
end;
set @EndDate = case day(@RunDate)
when 1 then dateadd(day,-1,dateadd(month, datediff(month, 0, @RunDate), 0))
else dateadd(day,Day(@RunDate)-2,dateadd(month, datediff(month, 0, @RunDate), 0))
end;
兩者的rextester演示: http ://rextester.com/CCUFI85069
嘗試更改代碼以設置日期,例如...
SET @StartDate = CONVERT(DATE,
CONCAT(MONTH(DATEADD(d, -1, @Rundate)),
'/21/',
IIF(MONTH(@Rundate) = '1', YEAR(@RunDate), YEAR(DATEADD(yy, -1, @Rundate)))) , 101)
完整的代碼如下所示:
Declare @RunDate date
Declare @StartDate Date
Declare @EndDate Date
Set @RunDate = '3/1/2017'
If (Day(@RunDate) = 1)
Begin
Set @StartDate = CONVERT(DATE, CONCAT(MONTH(DATEADD(d, -1, @Rundate)), '/21/',IIF(MONTH(@Rundate) = '1', YEAR(@RunDate), YEAR(DATEADD(yy, -1, @Rundate)))) , 101)
Set @EndDate = Convert(date,DATEADD(ms,-3,DATEADD(mm,0,DATEADD(mm,DATEDIFF(mm,0,@Rundate),0))),101)
End
Else
IF (Day(@RunDate) = 8)
Begin
Set @StartDate = Convert(Date, CONCAT(Month(@Rundate) , '/1/' , Year(@RunDate)) ,101)
Set @EndDate = Convert(Date, CONCAT(Month(@Rundate) , '/7/' , Year(@RunDate)) ,101)
End
Else
If (Day(@Rundate) = 15)
Begin
Set @StartDate = Convert(Date, CONCAT(Month(@Rundate) , '/8/' , Year(@RunDate)) ,101)
Set @EndDate = Convert(Date, CONCAT(Month(@Rundate) , '/14/' , Year(@RunDate)) ,101)
End
Else
If (Day(@Rundate) = 22)
Begin
Set @StartDate = Convert(Date, CONCAT(Month(@Rundate) , '/15/' , Year(@RunDate)) ,101)
Set @EndDate = Convert(Date, CONCAT(Month(@Rundate) , '/21/' , Year(@RunDate)) ,101)
END
SELECT @StartDate, @EndDate
您甚至可以隱藏重復的代碼並創建一個簡單的函數...
CREATE FUNCTION [dbo].[GetDateBasedOnStringNumber] (@num NVARCHAR(20), @RunDate DATE)
RETURNS DATE
WITH SCHEMABINDING AS
BEGIN
DECLARE @retDate DATE
SELECT @retDate = Convert(Date, CONCAT(Month(@RunDate) , @num , Year(@RunDate)) ,101)
RETURN @retDate ;
END;
然后改用此模式...
SELECT @StartDate = dbo.GetDateBasedOnStringNumber('/1/', @RunDate)
SELECT @EndDate = dbo.GetDateBasedOnStringNumber('/7/', @RunDate)
該錯誤是因為您試圖將integer
和varchar
值加在一起。 以這一行為例:
Set @StartDate = Convert(Date,(Month(DATEADD(d,-1,@Rundate)) + '/21/' + Case When Month(@Rundate) = '1' Then Year(@RunDate) Else Year(DATEADD(yy,-1,@Rundate)) End),101)
如果細分計算部分,則將具有月份integer
數值,日varchar
值和年份integer
數值。 如果嘗試將它們串聯,則會收到錯誤消息:
消息245,級別16,狀態1,第9行,將varchar值'/ 21 /'轉換為數據類型int時,轉換失敗。
您可以將integer
數值轉換為varchar
,它將起作用。
建議使用內置的date
函數,而不要使用串聯的函數,這樣可以達到相同的結果:
DECLARE
@RunDate DATE = '20170101'
, @StartDate DATE
, @EndDate DATE
IF DATEPART(DAY, @RunDate) = 1
SELECT
@StartDate = DATEADD(DAY, -(DATEPART(DAY, DATEADD(DAY, -1, @RunDate)) - 20), @RunDate)
, @EndDate = DATEADD(DAY, -1, @RunDate)
SELECT
@StartDate
, @EndDate
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.