1

こんにちは、私のテーブルには 3 つの列 (名前 - から - まで) と
データ型 time(7) が あり
ます 。 :00 shift3 から 22:00:00 から 08:00:00 で、何がシフトされているかを確認するために SP を作成しました。これが SP です。



create PROC SelectShift

AS
DECLARE @TimeNow TIME  =  substring(convert(varchar(20), GetDate(), 9), 13, 5) 
+ ' ' + substring(convert(varchar(30), GetDate(), 9), 25, 2)

SELECT s.Shift_Name, s.Id FROM Schedule s
WHERE @TimeNow BETWEEN s.ShiftTime_From AND s.ShiftTime_To


シフト 1 、 2 では正常に動作し
ますが、シフト 3 では null を選択します (現在の時刻は 22:55:00.0000000)
以前は SQL 時間を使用していないので、助けてもらえますか

4

2 に答える 2

1

時間変数では、シフトの開始が前日 (つまり、00:00:00 より前) か後かを判断する方法がないため、得られる結果は正しいものです。

次の方法を使用してこれを回避できますが、かなり醜いコーディングです。

DECLARE @TimeNow TIME  = '22:55:00.0000000'

-- substring(convert(varchar(20), GetDate(), 9), 13, 5) 
--+ ' ' + substring(convert(varchar(30), GetDate(), 9), 25, 2)


SELECT s.Shift_Name FROM #Schedule s
WHERE @TimeNow BETWEEN s.ShiftTime_From AND (CASE WHEN s.ShiftTime_From > s.ShiftTime_To THEN '23:59:59' ELSE s.ShiftTime_To END)
于 2013-10-28T22:03:43.057 に答える
1

私が最初に考えたのは、各間隔をシフトして 00:00:00 から始まると見なし、現在の時刻を同じ量だけシフトすることでしたが、時間の減算はサポートされていません。ということで、結局2ケース使いました。

これは、proc ではなくテーブル値関数である可能性があり、これにより、構成が容易になる可能性があります。

Create Proc ShiftForTime @time time as
Select 
    *
From
    schedule
Where (
        ShiftTime_From < ShiftTime_To and
        @time >= ShiftTime_From and
        @time < ShiftTime_To
    ) or (
        ShiftTime_From > ShiftTime_To and (
            @time >= ShiftTime_From or
            @time < ShiftTime_To
        )
    )
Go
Create Proc SelectShift As
Declare @now time = getdate()
Exec ShiftForTime @now

以下は、さまざまなテストを含むテーブル値関数を使用した例です。

Example SQLFiddle

知的好奇心のためだけに、私の最初の考えを機能させることができますが、効率は悪いかもしれません

Create Proc ShiftForTime2 @time time  as
Select 
    *
From
    schedule
Where
    dateadd(second, datediff(second, ShiftTime_From, 0), @time) 
      < dateadd(second, datediff(second, ShiftTime_From, 0), ShiftTime_To)
于 2013-10-28T22:00:54.780 に答える