2015-10-30 104 views
-1

我有如下的存儲過程:如果沒有開始日期和結束日期的記錄,存儲過程?

CREATE Procedure [dbo].[GetSleepData] 
    @period varchar(30), 
    @fitbit varchar(6), 
    @customdate datetime null, 
    @startdate datetime null, 
    @enddate datetime null 

    as 


    if(@period = 'week') 
    Begin 
    Set @customdate = Getdate() 
     Select Sleepkey, fitbitid,totalMinutesAsleep,totalSleepRecords,totalTimeInBed, datetime from sleep where fitbitid = @fitbit and 
     datetime <[email protected] datetime= @customdate - 7 
    End 

    else if(@period = 'month') 
    Begin 
    Set @customdate = Getdate() 
     Select Sleepkey, fitbitid,totalMinutesAsleep,totalSleepRecords,totalTimeInBed, datetime from sleep where fitbitid = @fitbit and 
     datetime<= @customdate and datetime >= @customdate - 30 
    End 

這是工作的罰款。我需要在select語句中添加一個if子句。它應該是這樣的:

如果startDate和/或endDate沒有記錄,它應該添加一個記錄,其中的值爲零。

+0

你應該看看這篇文章討論這樣的查詢與多個執行路徑。 http://sqlinthewild.co.za/index.php/2009/09/15/multiple-execution-paths/ –

+0

爲什麼比較字符串而不是日期? – lad2025

回答

2

首先,您可以將您的對帳單合併到一個SELECT

其次考慮使用DATEADD(d, -number, @customdate)的減法天日期,而不是@customdate - 7

CREATE Procedure [dbo].[GetSleepData] 
    @period  varchar(30), 
    @fitbit  varchar(6), 
    @customdate datetime = null, 
    @startdate datetime = null, 
    @enddate  datetime = null 
AS 
BEGIN 
SET NOCOUNT ON; 

-- you should here validate @period like 
-- IF @period NOT IN ('week', 'month') 
--  RAISEERROR(....) /THROW ...; 

SET @customdate = GETDATE(); 

SELECT Sleepkey, fitbitid,totalMinutesAsleep, 
     totalSleepRecords,totalTimeInBed, [datetime] 
INTO #temp 
FROM sleep 
WHERE fitbitid = @fitbit 
    AND [datetime] <= @customdate 
    AND [datetime] >= @customdate - (CASE @period 
            WHEN 'week' THEN 7 
            WHEN 'month' THEN 30 
            ELSE NULL --??? what if period is different 
           END; 

IF NOT EXISTS (SELECT 1 FROM #temp) 
BEGIN 
    SELECT 0 AS Sleepkey, 0 AS fitbitid, 0 AS totalMinutesAsleep, 
     0 AS totalSleepRecords, 0 AS totalTimeInBed, NULL AS [datetime] 
END 
ELSE 
BEGIN 
    SELECT Sleepkey, fitbitid,totalMinutesAsleep, 
      totalSleepRecords,totalTimeInBed, [datetime] 
    FROM #temp; 
END 

END 

不要將其命名像數據類型列:datetime應該被引用[datetime]

+1

偉大的解決方案!謝謝百萬小夥子...... – sony

+0

@sony不客氣:) – lad2025

相關問題