1

MySQL に関するレポートがいくつかあります。以下のコードは、問題に対する現在の解決策です。

スタッフのシフトが真夜中を超える時期を検討し始めるまでは、非常に簡単に思えるので、クエリを調整する必要があります。現在、次のように、日付/時間の範囲に応じてphpにさまざまなクエリを生成させています。

勤務シフトが同じ日の場合 (例: 2 日間にわたって午前 8 時から午後 8 時):

SELECT <select statements>
FROM <from statements>
WHERE
(
    (Date = '2012-04-16' AND Time BETWEEN '08:00:00' AND '20:00:00')
    OR
    (Date = '2012-04-02' AND Time BETWEEN '08:00:00' AND '20:00:00')
);

シフトが深夜を超えると、複雑になります (つまり、2 日間で午後 8 時から午前 8 時)。

SELECT <select statements>
FROM <from statements>
WHERE
(
    (
        (Date = '2012-04-16' AND Time >= '20:00:00')
        OR
        (Date = '2012-04-17' AND Time <= '08:00:00')
    )
    OR
    (
        (Date = '2012-04-17' AND Time >= '20:00:00')
        OR
        (Date = '2012-04-18' AND Time <= '08:00:00')
    )
);

ご想像のとおり、これらのクエリは、レポートに追加するたびに非常に長く、重くなります。これを行うためのよりスマートな方法があるに違いありません-誰かが洞察を提供できますか?

4

2 に答える 2

1

よりエレガントなコードが必要な場合は、次の部分をご覧ください。

    (Date = '2012-04-16' AND Time >= '20:00:00')
    OR
    (Date = '2012-04-17' AND Time <= '08:00:00')

次のように変更できます:

    (Date, Time) >= (DATE('2012-04-16'), TIME('20:00:00'))
    AND 
    (Date, Time) <= (DATE('2012-04-17'), TIME('08:00:00'))

複合インデックス(Date, Time)は、あなたと上記のバージョンの両方で役立ちます。


例のように、これらの条件がいくつかある場合:

SELECT <select statements>
FROM <from statements>
WHERE
(
    (
        (Date = '2012-04-16' AND Time >= '20:00:00')
        OR
        (Date = '2012-04-17' AND Time <= '08:00:00')
    )
    OR
    .....
    OR 
    (
        (Date = '2012-05-27' AND Time >= '20:00:00')
        OR
        (Date = '2012-05-28' AND Time <= '08:00:00')
    )
)

あなたはそれを次のように変えることができます:

SELECT <select statements>
FROM <from statements>
  CROSS JOIN
      ( SELECT TIME('20:00:00') AS start_time
             , TIME('08:00:00') AS end_time
      ) AS cc
  JOIN
      ( SELECT d                   AS this_day
             , d + INTERVAL 1 DAY  AS next_day
        FROM
          ( SELECT DATE('2012-04-16') AS d
          UNION ALL
            ...
          UNION ALL
            SELECT '2012-05-27'
          ) AS s 
      ) AS selected
     ON  (Date, Time) >= (selected.this_day, cc.start_time)
     AND (Date, Time) <= (selected.next_day, cc.end_time  )
于 2012-04-17T23:17:50.647 に答える
0

最近、このような問題に遭遇しました。夜勤を含む 3 シフトのコードを作成する必要があり、当日と翌日も含まれます。

コードは次のとおりです。

Select *, Case When Shifts = 'Night' and 
(DATEPART(HOUR,DATEADD(day,1,SystemDate_PST))>='00'               //next day data// 
and DATEPART(HOUR,DATEADD(day,1,SystemDate_PST)) <='06')
THEN DATEADD(DAY,-1, SystemDate_PST) else SystemDate_PST               // to show next day data as current day data//
end as Timings from 
(
Select *,
case 
when DATEPART(HOUR, SystemDate_PST)*60+DATEPART(MINUTE, SystemDate_PST) between
06*60+30 and 14*60+30 then 'Morning'
When DATEPART(HOUR, SystemDate_PST)*60+DATEPART(MINUTE, SystemDate_PST) between
23*60-30 and  23*60+60 then 'Night' 
when datepart(HOUR,dateadd(day,1,SystemDate_PST)) >='00' 
and datepart(HOUR,dateadd(day,1,SystemDate_PST))*60 + DATEPART(MINUTE, SystemDate_PST
<=07*60-30 then 'Night'
else 'Noon' 
end as Shifts from (Select * from Table) a )b

私のシフトのタイミングは次の とおり です

于 2018-11-20T13:05:26.037 に答える