StartTime
とEndTime
の両方をデータ型Time(0)
で格納する非常に単純なテーブルがあります。オーバーラップを防ぐ制約を適用する必要があります。 「触れる」時間帯は、午後2時から3時、午後3時から4時のように問題ありません。制約に使用する関数を作成しましたが、真夜中の時間帯を処理するのに苦労しています。何か助けていただければ幸いです!
これは、製品が毎日利用できる時間を促進します。残念ながら、これらの期間に正確な日付を添付することはできません。
製品が常に利用可能な場合、StartTimeとEndTimeは同じになります(00:00:00と00:00:00)。これはおそらく悪いデザインです。
アクティブな期間は、24時間の期間のみです。
EndTimeがStartTimeよりも大きいという要件は削除されました(phew!)。私は以下の答えを受け入れました、ありがとう!
24時間の制限により、関数を次のように変更できます。
CREATE FUNCTION [dbo].[fnIsItemGroupAvailabilityValid]
(
@availabilityStart time(0),
@availabilityEnd time(0)
)
RETURNS int
AS
BEGIN
DECLARE @OverLappingRows int
IF(@availabilityEnd > @availabilityStart)
BEGIN
SELECT @OverLappingRows = count(*)
FROM [dbo].[ItemGroupAvailability] iga
WHERE @availabilityStart < iga.AvailabilityEnd
AND @availabilityEnd > iga.AvailabilityStart
END
ELSE
SET @OverLappingRows = 1
RETURN @OverLappingRows
END
これは、時間が連続していることを保証します。そうでない場合は、何かが間違っていることを知らせるセンチネル値として@OverLappingRows = 1を返します。失敗のケースを明確にキャッチしたい場合は、-1などの他の値に設定できます。
比較時に等号を削除して、比較時に包含の側面を削除しました。これにより、タイムスパンが互いに重なることはありませんが、オーバーラップすることはありません。 ORを削除しました。クエリを実行する前に2つのタイムスタンプが連続していることを確認しているため冗長です。
最後に、終日は0:00から0:00ではなく0:00から23:59でなければなりません。それ以外の場合は、複雑なロジックを実行する必要があります。