2011-05-09 191 views
1

我修改SQL Server中的存儲過程2008年的原始程序參加了兩個日期添加日期參數和時間參數單日期時間

@StartDate DATETIME 
@EndDate DATETIME 

,並會時間部分轉換爲最早和最晚可能的時間分別。

我已經添加了兩個附加參數來接受時間部分。

@StartTime DATETIME 
@EndTime DATETIME 

時間部分是可選的。

RDL報告文件爲用戶在線生成報告。邏輯需要在存儲過程中發生。

我到目前爲止沒有太多,因爲我是離開我的元素的C#程序員。

IF (@StartTime IS NULL) 
    SET @StartDate = fn_SetBeginningTime(@StartDate) -- Sets time portion to earliest value 
ELSE 
    -- This is where I don't know how to add the time from @StartTime to the time portion of the datetime value @StartDate 
IF (@EndTime IS NULL) 
    -- This will do the same as the start time/start date 
+1

如果你在2008年,爲什麼你不使用更適合這些參數的數據類型(例如'date'和'time')。他們會讓答案更容易編寫,而不需要額外的假設 – 2011-05-09 14:40:13

+0

如前所述,我是C#程序員,這是我第一次進入SQL編碼領域。我的猜測是,DATETIME用於@StartDate/@EndDate,因爲時間部分被添加到它們,並且它們表示的字段是DateTime字段。 – 2011-05-09 14:45:56

+0

退後一步,告訴我們你在做什麼日期的時間部分。在SQL Server中,如果不指定時間,則datetime的時間部分默認爲午夜。例如。 'Set @StarDate ='5/9/2011''表示變量的時間部分是午夜。在TSQL中, – 2011-05-09 15:23:37

回答

0

假設:

  1. 通過最早你的意思是00:00:00的開始日期
  2. 通過最新的你的意思00:00:00當天結束日期後(與<=使用)

如果有任何,這將忽略來自@*Date PARAM並從@*Time PARAM日期時間。

declare @StartDate DATETIME = '15 jul 2010' 
declare @EndDate DATETIME = '15 jul 2010' 
declare @StartTime DATETIME = '06:06:06' 
declare @EndTime DATETIME = null 

--always make @StartDate/@EndDate's time 00:00:00 
SET @StartDate = CAST(@StartDate AS DATE) 
SET @EndDate = CAST(@EndDate AS DATE) 

IF (@StartTime IS NOT NULL)    -- set @StartDate's time to @StartTime 
    SET @StartDate += CAST(@StartTime AS TIME) 

IF (@EndTime IS NULL) 
    SET @EndDate += 1      --set it to midnight 
ELSE 
    SET @EndDate += CAST(@EndTime AS TIME) --set @EndDate's time to @EndTime 

select @StartDate, @EndDate 

>>> 2010-07-15 06:06:06.000,2010-07-16 00:00:00.000 

對於日期/時間;

declare @StartDate DATE = '15 jul 2010' 
declare @EndDate DATE = '15 jul 2010' 
declare @StartTime TIME = null 
declare @EndTime TIME = '22:22:22' 

declare @start datetime = cast(@StartDate as datetime) + coalesce(@StartTime, cast('00:00:00' as time)) 
declare @end datetime = cast(@EndDate as datetime) + coalesce(@EndTime, cast('23:59:59' as time)) 

select @start, @end 
+0

你的假設是有針對性的。函數fn_SetTimes將設置一個開始時間午夜,並結束時間到23:59:59用於<=。 – 2011-05-09 15:57:02

+0

我想這會導致我另一個問題。因爲我可以更改@StartTime和@EndTime的參數類型。將它們聲明爲TIME值會更好嗎?這樣,IF(@StartTime IS NOT NULL)SET @StartDate + = @StartTime或者CAST是必需的,因爲我們將TIME部分添加到DATETIME值中? – 2011-05-09 16:03:48

+0

我真正困惑的一部分是沒有測試環境。因此,我所做的任何更改都將直接進入生產服務器。我知道,愚蠢,但我不在這裏制定規則。 – 2011-05-09 16:05:21