簡體   English   中英

基於今天的日期范圍

[英]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能夠根據當前正在運行報告的當月哪一天進行更改。

  • 從1月1日開始,它需要從上個月的21日開始運行。
  • 在8號,它需要是本月的1號到7號。
  • 在15日,它應該是當月的8號到14號。
  • 在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,22day()

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)

該錯誤是因為您試圖將integervarchar值加在一起。 以這一行為例:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM