1

私はこれについて間違っていると思います。PHPで、データベース内の1日未満の行をプルしたいと思います。私はLaravelを使用していますが、それは関係ありません。これが私が持っているものです:

if ($day == 'today') {
    $date = date('Y-m-d H:i:s');
} elseif ($day == 'yesterday') {
    $date = date('Y-m-d H:i:s', strtotime('yesterday'));
} else {
    ...
}

$sql = "SELECT * FROM all_forms_main_contact WHERE DATEDIFF(timestamp, '" . $date . "') <= 1";
$mc = DB::select($sql);
return json_encode($mc);

ただし、それでは正しい結果が得られません。1日より古い結果が返されます。

4

5 に答える 5

4

それは本当に「1日未満」をどのように定義するかに依存します。

MySQLDATEDIFF関数は、日時値の日付部分のみを考慮し、整数の日数の差を返します。以下の両方のクエリは、「1日」を表す値1を返します。一方は、8時間の差であり、もう一方は、46時間の差です。

SELECT DATEDIFF('2013-01-15 07:00','2013-01-14 23:00') AS 8_hrs
SELECT DATEDIFF('2013-01-15 23:00','2013-01-14 01:00') AS 46_hrs

したがって、24時間より「古い」行がクエリによって返される可能性があり、予想されます。

hh:mi:ssDATEDIFF関数の引数として指定されているリテラルの時間部分は無視され、タイムスタンプ値の時間部分は無視されます。YYYY-MM-DD値だけを指定しても同じ結果が得られます。)


また、DATEDIFF関数の述語は引数にできないことに注意してください。つまり、MySQLは、その述語を満たすためにインデックスに対して範囲スキャンを実行できません。

最高のパフォーマンスを得るには、通常、裸の列にある同等の述語を優先します。

WHERE `timestamp` >= expr

これにより、オプティマイザは少なくともtimestamp列のインデックスで範囲スキャンを使用することを検討できます。

1日未満(24時間未満、または86400秒未満を意味する)で、最大1秒の解像度の行を探している場合は、次のいずれかの述語を使用できます。

WHERE `timestamp` >= '2013-01-15 16:10' + INTERVAL -1 DAY
WHERE `timestamp` >= '2013-01-15 16:10' + INTERVAL -24 HOUR
WHERE `timestamp` >= '2013-01-15 16:10' + INTERVAL -86400 SECOND

DATE_ADD関数は同等です。

WHERE `timestamp` >= DATE_ADD('2013-01-15 16:10',INTERVAL -1 DAY)

また、SQLテキストで現在の日付値をリテラルとして渡す必要がないことにも注意してください。NOW()MySQLには、、、などのMySQLサーバーから現在の日付と時刻を返す組み込み関数が用意されていCURRENT_DATE()ますSYSDATE()

それぞれ24時間未満または48時間前の行の場合:

WHERE `timestamp` >= DATE_ADD(NOW(),INTERVAL -1 DAY)
WHERE `timestamp` >= DATE_ADD(NOW(),INTERVAL -2 DAY)
于 2013-01-15T22:15:12.577 に答える
1

このクエリは、-24時間より新しい行を選択します。
たとえば、午前04:00の場合、すべての行を返します>=昨日午前04:00:

SELECT * FROM `tbl` WHERE `datetime` >= NOW() - INTERVAL 1 DAY

同様に-48時間より新しい場合。
たとえば、午前04:00の場合、昨日の午前04:00の前日にすべての行を返します。

SELECT * FROM `tbl` WHERE `datetime` >= NOW() - INTERVAL 2 DAY

このクエリは、今日の行を選択します。
たとえば、午前04:00の場合、すべての行を返す>=今日00:00AM:

SELECT * FROM `tbl` WHERE `datetime` >= CURDATE()

同様に、このクエリは昨日の行のみを選択します。
たとえば、午前04:00の場合、昨日の午前00:00から今日の午前00:00までのすべての行を返します。

SELECT * FROM `tbl` WHERE `datetime` >= CURDATE() - INTERVAL 1 DAY AND `datetime` < CURDATE()

日付クエリには上記の構文を使用します。これは、日付の追加/サブ関数よりもはるかに読みやすいと思います。

于 2013-01-15T22:02:30.587 に答える
0

してみませんか:

SELECT ... WHERE timestamp BETWEEN DATE_SUB(NOW(), INTERVAL 1 DAY) AND NOW()
于 2013-01-15T21:58:46.553 に答える
0

通常は、次のようにコーディングします。

...
where timestamp > subdate(now(), 1)

の便利なバージョンではsubdate()、日を単純な整数として指定できることに注意してください(つまり、デフォルトの間隔タイプはですDAY)。また、最初のパラメーターがdaretineの場合、subdateは日時を返します。

于 2013-01-15T22:02:45.373 に答える
0

DATEDIFFは時間コンポーネントを無視しますが(DATEDIFF-MariaDBナレッジを参照)、TIMESTAMPDIFFは無視しません。したがって、これは機能します:

SELECT ... WHERE TIMESTAMPDIFF(DAY, NOW(), `timestamp`) = '0'

たとえば、NOW()='2020-01-0200:00:01'でtimestamp'2020-01-0101:00:00'の場合、上記のコードは正確に0日を返しますが、DATEDIFFは誤って1日を返します(時間コンポーネントを無視するためです。

于 2020-10-15T10:50:23.047 に答える