SQLのヒント
日付範囲と書式設定の操作
さまざまな日付要件に基づいてデータを取得する
主に集計関数 DATEADD()、DATESUB() およびキーワード interval を使用します。
半年間の指定時間をフィルタリングする
アイデア: 実際には、現在時刻から 5 か月を引きます。
SELECT date,user_id FROM TABLENAME
WHERE
from_unixtime(timestamp / 1000) >= DATE_SUB(CURDATE(), interval 5 month)
n日前の指定時刻をフィルタリングする
アイデア: 時間の計算を操作する必要がありますが、左右の境界を制御することを忘れないでください。そうしないと、クエリ データの欠落や混乱といった問題が発生します。
from_unixtime({指定时间} / 1000)+INTERVAL 1 DAY - INTERVAL 1 SECOND
現在時刻を直接使用して取得する場合23-9-27 00:00:00
、現在時刻は範囲に含まれませんINTERVAL 1 DAY - INTERVAL 1 SECOND
。23-9-27 23:59:59
データが正常に表示されていることを確認します
SELECT date,user_id FROM TABLENAME
WHERE
from_unixtime(timestamp / 1000) >= DATE_SUB(from_unixtime({指定时间} / 1000), interval 20 day)
AND
from_unixtime({指定时间} / 1000)+INTERVAL 1 DAY - INTERVAL 1 SECOND >= from_unixtime(`timestamp`/ 1000)
n 週間の指定された時刻の最初の日を今週のデータ ヘッダーとして取得します
機能の説明:
timestamp / 1000
: タイムスタンプを 1000 で割って秒に変換します。from_unixtime()
: 秒を Unix タイムスタンプに変換します。date_sub()
: 指定した時間から時間を引いた時間を計算します。dayofweek(from_unixtime(timestamp / 1000)) - 2 day
: 指定した時刻の曜日から 2 日を引いた値を計算し、日付オフセットの計算に使用します。DATE_FORMAT()
: 日付を指定された形式にフォーマットします。この形式は%Y
年を表し、%c
月の英語略語を表し、%d
日付を表します。
dayofweek
現在時刻を取得する週の最初の曜日を使用して形式を書き換えます
SELECT
DATE_FORMAT(date_sub(from_unixtime(timestamp / 1000), interval
dayofweek(from_unixtime(timestamp / 1000)) - 2 day), '%Y%c%d') AS date
, user_id
FROM TABLENAME
WHERE
from_unixtime(timestamp / 1000) >=
date_sub(from_unixtime(#{指定时间} / 1000), interval 10 week)
指定した日数の各時間帯のデータ
SQL の長さを見ると、実際にはデータの時間をフォーマットし、時、分、秒の境界を判断しています。
-
SELECT DATE_FORMAT(from_unixtime(timestamp / 1000), '%H') AS date, user_id
: タイムスタンプを Unix タイムスタンプに変換した後、時間 (24 時間形式) にフォーマットし、「日付」という名前を付けて、ユーザー ID 列を選択します。 -
WHERE from_unixtime(timestamp / 1000) > str_to_date(...) AND DATE_ADD(...) > from_unixtime(timestamp / 1000)
:クエリ条件を設定します。
str_to_date(DATE_FORMAT(from_unixtime(${指定时间} / 1000), '%Y-%m-%d'), '%Y-%m-%d %H:%i:%s')
:指定した時間(秒)を日付形式に変換し、「指定した時間」という名前を付けます。DATE_ADD(str_to_date(...), INTERVAL 1 DAY)
:指定した時刻に1日間隔を加算します。DATE_ADD(..., INTERVAL -1 SECOND)
: 前のステップの結果から 1 秒の時間間隔を減算します。> from_unixtime(timestamp / 1000)
: タイムスタンプが前のステップの結果より大きいタイムスタンプを除外します。
SELECT DATE_FORMAT(from_unixtime(timestamp / 1000), '%H') AS date
, user_id
FROM TABLENAME
WHERE
from_unixtime(timestamp / 1000) >
str_to_date(DATE_FORMAT(from_unixtime(${指定时间} / 1000), '%Y-%m-%d'), '%Y-%m-%d %H:%i:%s')
AND DATE_ADD(
DATE_ADD(str_to_date(DATE_FORMAT(from_unixtime(${指定时间} / 1000), '%Y-%m-%d'), '%Y-%m-%d %H:%i:%s'),
INTERVAL 1 DAY), INTERVAL -1 SECOND) > from_unixtime(timestamp / 1000)