1

私は(私にとって)巨大なSQLの問題を扱っています。id、name、from、to の 4 つの列を持つ「timeshifts」というテーブルがあります。最後の 2 つのタイプは TIME です。

現在: 3 つのタイムシフトがあります: 06:00 - 14:00 14:00 - 22:00 22:00 - 06:00

ここで、現在の時刻の正しいシフトを見つける必要があります (これは魅力的な方法です) が、現在のシフトに属する適切なレコードを見つけることができません。すなわち。user_times というテーブルには、日付と時刻の値が別々のフィールドが含まれています。現在のタイムシフトによると、タイムシフトに属するレコードを見つける必要があります。最初の 2 シフトは問題ありませんが、3 番目のシフトは午前 0 時を過ぎます。それが私の問題です。

以下は、真夜中までの適切なシフト、イベントを検索するクエリです。

SELECT 
  FLOOR(SUM(time_sum) / 60) AS th,
  MOD(SUM(time_sum), 60) AS tm,
  t.* 
FROM
  ur_user_times ut,
  ur_timeshifts t 
WHERE CURTIME() >= IF (
    t.timeshift_to < t.timeshift_from,
    0,
    ADDTIME(t.timeshift_from, "00:15")
  ) 
  AND CURTIME() <= ADDTIME(
    IF (
      t.timeshift_to < t.timeshift_from,
      ADDTIME(t.timeshift_from, "10:00:00"),
      t.timeshift_to
    ),
    "00:15"
  ) 
  AND ut.`date` BETWEEN CURDATE() - INTERVAL 1 DAY AND CURDATE()
  AND ut.`start` BETWEEN ADDTIME(t.`timeshift_from`, "-10:00:00") AND ADDTIME(t.`timeshift_to`, "-10:00:00")
  AND ut.user_id = 40 

ut.start は、関心のある時間値です。

4

2 に答える 2

2

これを試して:

select *
from timeshifts ts,
usertimes ut
where 
(ts.from < ts.to and ut.start >= ts.from and ut.start <= ts.to) OR
(ts.from > ts.to and (ut.start >= ts.from or ut.start <= ts.to))
于 2012-10-05T09:38:36.340 に答える
1

同様のクエリが数日前に投稿されました。

この質問を見てください:

SQLサーバークエリでのシフトごとの日時チェック

于 2012-10-05T09:38:53.523 に答える