2013-01-16 37 views
1

我在存儲過程中有一條if語句,用於派生一些時間值。它看起來像這樣:在sql中使用時間戳

DECLARE @foo TIME 
    IF (SELECT CONVERT(TIME,SYSUTCDATETIME())) > '15:00' 
     SET @foo = DATEADD(hh,-15,CONVERT(TIME,SYSUTCDATETIME())) 
    ELSE 
     SET @foo = DATEADD(hh,+9,CONVERT(TIME,SYSUTCDATETIME())) 

後來我想使用該值以下WHERE子句中:

AND created_at > DATEADD(hh,[email protected], CONVERT(TIME,SYSUTCDATETIME())) 

我不斷收到錯誤的數據類型,時間是負無效運營商。我怎樣才能解決這個問題,使和子句工作。我已經嘗試轉換數據類型,我有點理解問題DATEADD(hh)正在尋找參數2是一個int不是一次。有沒有一些更簡單的方法來做到這一點,我必須承認,如果你不能告訴我,我的時間戳根本不好。任何幫助表示讚賞。

DECLARE @DailyLimitOffsetTime TIME 
IF (SELECT CONVERT(TIME,SYSUTCDATETIME())) > '15:00' 
    SET @DailyLimitOffsetTime = DATEADD(hh,-15,CONVERT(TIME,SYSUTCDATETIME())) 
ELSE 
    SET @DailyLimitOffsetTime = DATEADD(hh,+9,CONVERT(TIME,SYSUTCDATETIME())) 

IF @Limit <= 
(
    SELECT COUNT(*) 
    FROM dbo.fooTable 
    WHERE offerId = @OfferID 
    AND created_at > 
    DATEADD(hh,DATEPART(hh,[email protected]),CONVERT(TIME,SYSUTCDATETIME())) 
) 
    SET @ErrorTypeID = 9400 

我肯定有一個更好的方法來做到這一點,如果是的話,請分享如何。一如既往的讚賞。如果您需要關於此問題的進一步解釋,請告訴我。這個有點亂。

回答

1

第二個參數必須被解析到一個int

AND created_at > DATEADD(hh, -DATEPART(hh, @DailyLimitOffsetTime), CONVERT(TIME,SYSUTCDATETIME())) 

OR

DECLARE @time time = CONVERT(TIME, SYSUTCDATETIME()) 
IF @Limit <= 
(
    SELECT COUNT(*) 
    FROM dbo.fooTable 
    WHERE offerId = @OfferID 
    AND created_at > 
    CASE WHEN @time > '15:00' 
     THEN DATEADD(hh, 15, DATEADD(hh, -DATEPART(hh, @time), @time)) 
     ELSE DATEADD(hh, 09, DATEADD(hh, -DATEPART(hh, @time), @time)) END 
    END  
) 
SET @ErrorTypeID = 9400 
+0

這仍然會失敗並出現相同的錯誤。 消息8117,級別16,狀態1,過程CreateTransaction,行160操作數數據類型時間對於負運算符無效。 – SSISPissesMeOff

+0

即使添加convert(int,@ DailyLimitOffsetTime)也不起作用,但出現以下錯誤:Msg 529,Level 16,State 2,Line 6 不允許將數據類型int顯式轉換爲時間。 – SSISPissesMeOff

+0

@SSISPissesMeOff立即嘗試。 –

0

我不明白你在做什麼,因爲你總是會做同樣的事情,而不是僅僅是時間。如果您在UTC時間晚於某個地點下午3點後嘗試顯示不同的一天,則不需要這樣做。所以,如果你想要提前九小時,你將不會因爲你只使用時間表來解釋當天的情況。所以如果是1-16-12的8點,你會把時間設定爲5點。我認爲你需要設置你想要的日期時間,而不僅僅是時間。在DATEADD函數

DECLARE @foo Datetime 
    IF (SELECT CONVERT(TIME,SYSUTCDATETIME())) > '15:00' 
     SET @foo = Dateadd(hh, datediff(hh, 0, sysutcdatetime()) -15, 0) 
    ELSE 
     SET @foo = Dateadd(hh, datediff(hh, 0, sysutcdatetime()) + 9, 0) 

select @foo 
+0

什麼,我試圖完成的就是這個。我對可以購買的物品有限制。所有采購都以UTC時間存儲。我想檢查一下,確保所有在24小時UTC時間段內的購買都計入該支票中。所以我有上面的if語句在一個變量中填充小時,然後我以下面的方式使用該變量。 (查看更新後的問題) – SSISPissesMeOff