1

私はコードで立ち往生しています。入力されたイベントの前、後、および最中に、MySQL データベースからウィッチ イベントを確認したいと考えています。

次のフィールドを持つテーブルがあります。

  • Event_id(int AUTO_INCREMENT)
  • start_date(日にち)
  • start_time(varchar)
  • end_date(日にち)
  • end_time(varchar)

開始時刻と終了時刻は 24 時間形式で、コロン区切り記号なしで:保存されます (したがって、23:50 は 2350 として保存され、1:00 は 0100 として保存されます)。

入力されたイベントの日時は同じ形式になります。

入力されたイベントに最も近いイベントを取得するクエリ (またはスクリプト)、入力されたイベント中にイベントがあるかどうかを確認するクエリ、および入力されたイベントの後に最も近いイベントを取得するクエリを作成するにはどうすればよいですか?

4

3 に答える 3

1

まず、スキームを変更することから始めます。

event_id (int AUTO_INCREMENT),
start_date (timestamp), 
end_date (timestamp)

クエリに を使用できるようになりTIMEDIFFました。

最寄りのイベント

SELECT *, TIMEDIFF(input_date, start_date) diff
FROM events ORDER BY diff LIMIT 1

そうすれば、次のイベントにつながります。

イベント中のイベント

SELECT * FROM events
WHERE
  TIMEDIFF(input_date, start_date) > 0 AND
  TIMEDIFF(input_date, end_date) < 0
FROM events

これにより、進行中のイベントが表示されます。

比較を行う前にTIMEDIFF、をラップする必要がある場合があります。SECONDS()

于 2012-06-13T12:44:23.883 に答える
0

これを実現するには、DATE + VARCHAR フィールドを DATETIME などのより適切なものに変換する必要があります (私は datetime を好みます。クエリを実行すると読みやすく、内部的にはタイムスタンプと同じくらい高速です)。

次に、4 つのフィールドを 2 つのフィールドにマージした後、2 種類のクエリを使用できます。

SELECT
    CASE 
        WHEN startDateTime <= "targetDate" AND endDateTime > "targetDate" THEN "while"
        WHEN startDateTime > "targetDate" THEN "before"
        WHEN endDateTime <= "targetDate" THEN "after"
    END AS timeframe,
    events.*
FROM
    events

または、共用体も使用できます。どちらも同様の結果になります。好みのほうを選択してください。

SELECT "before" AS timeframe, events.* FROM events
WHERE startDateTime > "targetDate"
UNION
SELECT "while" AS timeframe, events.* FROM events
WHERE startDateTime <= "targetDate" AND endDateTime > "targetDate"
UNION
SELECT "after" AS timeframe, events.* FROM events
WHERE endDateTime <= "targetDate"

PS: テストはしていませんが、アイデアは正しいので、適応させる必要があるかもしれません。

幸運を

于 2012-06-13T12:45:13.033 に答える
0

次の前に最も近い:

Select * from Event_table where start_date<=[imputed start_date] and start_time<[imputed start_time] order by start_date DESC, start_time DESC LIMIT 1

この sql は、帰属イベントの前にイベントのリストを取得し、最初の結果が最も近いものになるように、日付の子孫と開始時刻の子孫で並べ替えられます。LIMIT 1 は 1 つのレコードのみを回復し、前に最も近いものを取得します。

おそらく、イベントの最も近い終了を取得するために、(start_date と開始時刻ではなく) end_date と end_time でフィルター処理することをお勧めします。

変更後に最も近いものを取得するには [帰属開始日] および [帰属開始時刻] を end_date および end_time に変更し、'>' の場合は '<'

帰属イベント中のイベント数を取得するには、次の単純なクエリを使用します。

Select count(event_id) from event_table where ( start_date between ([imputed start_date] and [imputed end_date]) or end_date between ([imputed start_date] and [imputed end_date]) ) AND (start_time between ([imputed start_time] and [imputed end_time]) OR (end_time between ([imputed start_time] and [imputed end_time]))
于 2012-06-13T12:45:57.743 に答える