3

日付フィールド(schedule_date)と時間番号(0..23)を文字列として保持するvarcharフィールド(schedule time)を持つテーブルがあります。

2つのクエリがあります。

クエリ1)今後のスケジュールを返します
a)日付>今日
のすべてb)そして日付が現在の日付と一致するが時間>現在の時間のすべて

クエリ2)1レコードを返します-最後の実行スケジュール時間

私はこの2つを組み合わせる方法を模索してきましたが、単純な結合を超えた2つの問題にどのように対処するかがわかりません。サブクエリが含まれると思いますが、ここではSQLスキルの限界に達しています。

問題1): 2番目のクエリのみに「LIMIT1」が必要です-クエリ2だけに適用するにはどうすればよいですか?

問題2): LIMIT 1が正しく機能するには、2番目のクエリにDESC順序が必要ですが、両方のクエリの結果をASC順序で組み合わせる必要があります

注:以下の現在の時刻に+1時間を追加します(ストアの日付はESTであり、サーバーはNOWのCSTを返します)

質問1:今後のスケジュールを返す

SELECT schedule_date,  CONVERT(schedule_time, DECIMAL) AS schedule_time
FROM special_schedules
WHERE schedule_date > DATE(NOW())
UNION 
SELECT schedule_date,  CONVERT(schedule_time, DECIMAL) AS schedule_time
FROM special_schedules
WHERE schedule_date = DATE(NOW())
AND CONVERT(schedule_time, DECIMAL) > (HOUR(CURRENT_TIME()) + 1)

クエリ2:最後のターンスケジュールを返します (LIMIT 1を最後のスケジュールに配置するにはDESCオーダーが必要です)

SELECT schedule_date,  CONVERT(schedule_time, DECIMAL) AS schedule_time
FROM special_schedules
WHERE schedule_date = DATE(NOW())
AND CONVERT(schedule_time, DECIMAL) < (HOUR(CURRENT_TIME()) + 1)
UNION
SELECT schedule_date,  CONVERT(schedule_time, DECIMAL) AS schedule_time
FROM special_schedules
WHERE schedule_date < DATE(NOW())
ORDER BY schedule_date DESC, schedule_time DESC
LIMIT 1

編集:上記の注文を修正しました(DESCによるものである必要があります)

組み合わせる場合は、両方を組み合わせた結果をASCに並べ替える必要があります。

ORDER BY schedule_date ASC, schedule_time ASC

ありがとう!

4

2 に答える 2

0
SELECT schedule_date, schedule_time
FROM (( SELECT schedule_date, CONVERT(schedule_time, DECIMAL) AS schedule_time
        FROM special_schedules
        WHERE schedule_date = DATE(NOW())
            AND CONVERT(schedule_time, DECIMAL) < (HOUR(CURRENT_TIME()) + 1))
        UNION
    (   SELECT schedule_date, CONVERT(schedule_time, DECIMAL)
        FROM special_schedules
        WHERE schedule_date < DATE(NOW())
        ORDER BY schedule_date DESC
        LIMIT 1)) AS h
ORDER BY schedule_date DESC

これはあなたが求めていることをするはずです。

于 2012-05-14T12:36:20.743 に答える
0

まず、2つのクエリを単純にUNIONすることができます。括弧で囲む必要があるのは、2番目のクエリだけです。

SELECT schedule_date,  CONVERT(schedule_time, DECIMAL) AS schedule_time
FROM special_schedules
WHERE schedule_date > DATE(NOW())
UNION 
SELECT schedule_date,  CONVERT(schedule_time, DECIMAL) AS schedule_time
FROM special_schedules
WHERE schedule_date = DATE(NOW())
AND CONVERT(schedule_time, DECIMAL) > (HOUR(CURRENT_TIME()) + 1)
UNION ALL
(
SELECT schedule_date,  CONVERT(schedule_time, DECIMAL) AS schedule_time
FROM special_schedules
WHERE schedule_date = DATE(NOW())
AND CONVERT(schedule_time, DECIMAL) < (HOUR(CURRENT_TIME()) + 1)
UNION
SELECT schedule_date,  CONVERT(schedule_time, DECIMAL) AS schedule_time
FROM special_schedules
WHERE schedule_date < DATE(NOW())
ORDER BY schedule_date DESC, schedule_time DESC
LIMIT 1
)
ORDER BY schedule_date ASC, schedule_time ASC

ORただし、次のように、UNIONを-ed条件を使用する単一のSELECTに変換することで、両方のクエリを簡略化できます。

  1. SELECT schedule_date,  CONVERT(schedule_time, DECIMAL) AS schedule_time
    FROM special_schedules
    WHERE schedule_date > DATE(NOW())
       OR schedule_date = DATE(NOW()) AND CONVERT(schedule_time, DECIMAL) > HOUR(CURRENT_TIME())
    
  2. SELECT schedule_date,  CONVERT(schedule_time, DECIMAL) AS schedule_time
    FROM special_schedules
    WHERE schedule_date < DATE(NOW())
       OR schedule_date = DATE(NOW()) AND CONVERT(schedule_time, DECIMAL) < HOUR(CURRENT_TIME())
    ORDER BY schedule_date DESC, schedule_time DESC
    LIMIT 1
    

そして、組み合わされたクエリは次のようになります。

SELECT schedule_date,  CONVERT(schedule_time, DECIMAL) AS schedule_time
FROM special_schedules
WHERE schedule_date > DATE(NOW())
   OR schedule_date = DATE(NOW()) AND CONVERT(schedule_time, DECIMAL) > HOUR(CURRENT_TIME())
UNION ALL
(
SELECT schedule_date,  CONVERT(schedule_time, DECIMAL) AS schedule_time
FROM special_schedules
WHERE schedule_date < DATE(NOW())
   OR schedule_date = DATE(NOW()) AND CONVERT(schedule_time, DECIMAL) < HOUR(CURRENT_TIME())
ORDER BY schedule_date DESC, schedule_time DESC
LIMIT 1
)
ORDER BY schedule_date ASC, schedule_time ASC

そして、次のように、単一の外観の値にschedule_date変換することを含む別のオプションがあります。schedule_timeDATETIME

CONCAT(schedule_date, ' ', schedule_time, ':00')

この場合の結果のクエリは次のようになります。

SELECT schedule_date,  CONVERT(schedule_time, DECIMAL) AS schedule_time
FROM special_schedules
WHERE CONCAT(schedule_date, ' ', schedule_time, ':00') > (NOW() + INTERVAL 1 HOUR)

UNION ALL

(
SELECT schedule_date,  CONVERT(schedule_time, DECIMAL) AS schedule_time
FROM special_schedules
WHERE CONCAT(schedule_date, ' ', schedule_time, ':00') < (NOW() + INTERVAL 1 HOUR)
ORDER BY schedule_date DESC, schedule_time DESC
LIMIT 1
)

ORDER BY schedule_date ASC, schedule_time ASC
于 2012-05-14T15:13:10.907 に答える