1

ある時間値を導出するために使用されているストアドプロシージャにifステートメントがあります。次のようになります。

    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,-@DailyLimitOffsetTime, CONVERT(TIME,SYSUTCDATETIME()))

マイナス演算子のデータ型時間が無効であるというエラーが発生し続けます。and句を機能させるためにこれを回避するにはどうすればよいですか。データ型を変換しようとしましたが、DATEADD(hh)がパラメータ2を時間ではなく整数として探しているという問題をある程度理解しています。これを行う簡単な方法はありますか。タイムスタンプがまったく得意ではないことがまだわからない場合は、認める必要があります。どんな助けでも大歓迎です。

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,-@DailyLimitOffsetTime),CONVERT(TIME,SYSUTCDATETIME()))
)
    SET @ErrorTypeID = 9400

これを行うにはもっと良い方法があると確信しています。もしそうなら、その方法を教えてください。いつものようにどんな助けもありがたいです。この問題についてさらに説明が必要な場合は、お知らせください。これは少し面倒です。

4

2 に答える 2

1

DATEADD関数の2番目の引数はintに解決する必要があります

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

また

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
于 2013-01-17T09:49:44.837 に答える
0

あなたはいつも同じ時間を作り、日付だけを説明しないので、あなたが何をしているのかわかりません。UTC 時間が場所の午後 3 時以降である場合に、別の日付を表示しようとしている場合、これは望ましくありません。したがって、9 時間先に進みたい場合は、時間枠を使用して現在の日のみを考慮しているため、そうはなりません。したがって、1-16-12 の午後 8 時であれば、時刻を午前 5 時に設定します。時間だけでなく、必要に応じて DATETIME を設定する必要があると思います。

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
于 2013-01-16T23:58:36.477 に答える