時間データ型に分を追加するにはどうすればよいですか?


10

2つのレコードをテーブルに挿入するストアドプロシージャがあります。レコード間の違いは、2番目のレコードの時間列が@MinToAdd最初のレコードの後であることです。

CREATE PROCEDURE CreateEntry
    /*Other columns*/
    @StartTime time(2),
    @EndTime time(2),
    @MinutesToAdd smallint
    AS
BEGIN
    SET NOCOUNT ON;

    SET @MinutesToAdd = @MinutesToAdd % 1440;   --Prevent overflow if needed?
    IF (@MinutesToAdd > 0)
    BEGIN
    INSERT INTO ClientNotification (/*Other columns*/ startTime, endTime)
        OUTPUT inserted.id
        VALUES
               (/*Other columns*/ @StartTime, @EndTime),
               (/*Other columns*/ @StartTime + @MinutesToAdd, @EndTime + @MinutesToAdd);
    END
    ELSE
    BEGIN
        /*Whatever ELSE does.*/
    END
END

追加するための正しい方法は何である@MinutesToAddの分@StartTimeとは@EndTime?データタイプ
を使用していることに注意してくださいtime

更新
正解には次の情報が含まれている必要があります。

  • timeデータ型に分を追加する方法。
  • 提案された解決策は精度の損失をもたらさないこと。
  • 分が大きすぎてtime変数に収まらない場合、または変数がロールtimeオーバーされるリスクがある場合に注意する必要がある問題または懸念。問題がない場合はその旨を明記してください。

5
質問を編集して、手元の質問をさらに明確にする方法はわかりません。
swasheck 2013年

@swasheck私が探している3つのことを明確に述べています。また、探していないものにも限界を設けました。
2013年

回答:


36

新しい型では、レイジーショートハンド算術を使用できません。試してください:

DATEADD(MINUTE, @MinutesToAdd, @StartTime)

@MinutesToAddオーバーフローから保護したとしても、オーバーフローから結果を保護していないことに注意してください。これでエラーが発生することはありませんが、期待した結果にならない場合があります。

DECLARE @StartTime TIME(0) = '23:59';
DECLARE @MinutesToAdd INT = 20;

SELECT DATEADD(MINUTE, @MinutesToAdd, @StartTime);

結果:

00:19:00

次のように言ってもその結果を得ることができなかったので、これはある種の内部変換を通過する必要があると思います。

DECLARE @StartTime TIME(0) = '24:19';

結果:

メッセージ241、レベル16、状態1、行1
文字列から日付または時刻、あるいはその両方を変換するときに変換に失敗しました。

あなたは計算を処理する方法を検討する必要があるとリードそのいずれか@EndTimeまたは両方@StartTime@EndTime、次の日にあるように。

また、「理想的な答え」の別の新しい要件に対処するために、精度が失われることはありません。ドキュメントに従って、の戻り値の型はDATEADD入力と同じです:

戻りデータ型は、文字列リテラルを除いて、日付引数のデータ型です。

したがって、TIMEイン、TIMEアウト。


1
+1 @Aaronまたは、StartTimeとTimeToAddをdatetimeに変換してから追加することもできます。分が59より大きい場合、TimeToAddの変換は非常に複雑になります。DATEADDが最良のソリューションです。
ブライアン、2013年

追加するとDATEADD、日付引数と同じ型が返されますが、受け入れます。「必要に応じてオーバーフローを防止しますか?」ラインは必要ありません。ロールオーバーの問題は、データのソースとデータの宛先によって処理されます。
2013年

3
@Trisped確かに、DATETIMEしか返せず、問題を引き起こす可能性があると考えたため、DATEADDが適切であるとは思わなかった質問に追加した場合。そうでなければ、それはあなたの質問や将来の読者にとって適切ではないようです...
アーロン・ベルトラン

「時間データタイプを使用していることに注意してください。」によって関連性がどのように意味されないのですか?また、なぜ私の質問を変更して、レコードではなく行を使用するようにしたのですか?
2013年

1
@Trisped編集は、より良い用語を使用して参照してください。編集のFAQ -letsは、任意のより多くの前後を持っていないか、私は疑問をロックします。アーロンは、私たちが他の人にすべてを明確にする必要があるのは正しいです、あなたはあなたの答えを持っています。役立つと思われる場合は、質問に沿って編集することを検討してください。アーロンは、回答に必要な情報を追加することを提案しています。
ジャックはtopanswers.xyzを2013年

0

dateadd関数を使用して、分を「0:00」に対して整数で追加します。次に、キャストして時間を戻します。

キャスト(dateadd(minute、84、 '0:00')を時間として選択)

ここで、84は「時間」型で表現したい整数分です。

これを「0:00」に追加し、日付コンポーネントを削除するために、時間型にキャストしました。カスタムコーディングは必要ありません。

(列名なし)

01:24:00.0000000

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.