MySQLが昨日の日付を選択


101

日付が昨日である値を表示およびカウントするにはどうすればよいですか?使ったtime()はデータベースに日付を挿入していました。例:

URL: google.com youtube.com google.com youtube.com test.com youtube.com
DateVisited: 1313668492 1313668540 1313668571 13154314

テーブルに存在する複数のURLの数と、昨日アクセスされたそのURLの数を表示します。結果の例:

LINK       | timesExisted | timesVisitedYesterday
Google.com |       2      | 2
youtube.com|       3      | 3

昨日の日付を取得するアイデアはすでにありますが、昨日のURLの存在回数をカウントしたり、テーブルにURLが存在した回数をカウントしたりするアイデアはありません。

回答:


165

昨日の日付を取得する最も簡単で最良の方法は次のとおりです。

subdate(current_date, 1)

あなたのクエリは次のようになります:

SELECT 
    url as LINK,
    count(*) as timesExisted,
    sum(DateVisited between UNIX_TIMESTAMP(subdate(current_date, 1)) and
        UNIX_TIMESTAMP(current_date)) as timesVisitedYesterday
FROM mytable
GROUP BY 1

奇妙なことに、条件を満たしている行sum(condition)を提供する理由は、そうでなければ面倒で冗長なcaseステートメントが必要になるため、mysqlではブール値が1trueおよび0falseであるため、条件を合計すると実際に何回カウントされるかですそれは本当です。このパターンを使用すると、SQLコードを改善できます。


89
SELECT SUBDATE(NOW(),1);

where()関数は、タイムスタンプでシステムの現在の日付と時刻を返します...

あなたは使うことができます:

SELECT SUBDATE(CURDATE(),1)

3
私のために働いた。多くの感謝
マーブルジョージ

19

以下を使用できます。

SELECT SUBDATE(NOW(), 1);

または

SELECT SUBDATE(NOW(), INTERVAL 1 DAY);

または

SELECT NOW() - INTERVAL 1 DAY;

または

SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);

11

式を使用すると、昨日の日付を取得できますCAST(NOW() - INTERVAL 1 DAY AS DATE)。したがって、次のようなものが機能する可能性があります。

SELECT * FROM your_table

WHERE DateVisited >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND DateVisited <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));

9

先週のクエリ:

SELECT *
FROM dual
WHERE search_date BETWEEN SUBDATE(CURDATE(), 7) AND CURDATE()

9

最後または次の日付、週、月、年の計算。誰にとっても役に立つかもしれません。

現在の日付:

select curdate();

昨日:

select subdate(curdate(), 1)

明日:

select adddate(curdate(), 1)

過去1週間:

select between subdate(curdate(), 7) and subdate(curdate(), 1)

次の1週間:

between adddate(curdate(), 7) and adddate(curdate(), 1)

過去1か月:

between subdate(curdate(), 30) and subdate(curdate(), 1)

次の1か月:

between adddate(curdate(), 30) and adddate(curdate(), 1)

今月:

subdate(curdate(),day(curdate())-1) and last_day(curdate());

過去1年間:

between subdate(curdate(), 365) and subdate(curdate(), 1)

次の1年:

between adddate(curdate(), 365) and adddate(curdate(), 1)

7

選ばれた答えは正確でより簡潔ですが、他の答えで指摘されている構造について私は主張します:

SELECT * FROM your_table
WHERE UNIX_TIMESTAMP(DateVisited) >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND UNIX_TIMESTAMP(DateVisited) <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));

タイムスタンプなしの日付のみが必要な場合は、次のように記述することもできます。

SELECT * FROM your_table
WHERE DateVisited >= CAST(NOW() - INTERVAL 1 DAY AS DATE)
  AND DateVisited <= CAST(NOW() AS DATE);

使用する理由CASTSUBDATEISは、CASTANSI SQL構文です。 SUBDATEの日付演算コンポーネントのMySQL固有の実装です。CAST。ANSI構文を使用する習慣を身に付けると、別のデータベースに移行する必要が生じた場合に頭痛の種を減らすことができます。また、将来はほぼ確実に他のDBMSを使用するようになるので、専門家としての習慣を身に付けることも良いでしょう。

主要なDBMSシステムはどれもANSIに完全に準拠していませんが、それらのほとんどは幅広いANSI構文のセットを実装していますが、MySQLとその子孫(MariaDB、Perconaなど)以外のシステムはほとんどMySQL固有の構文を実装していません。


なぜ一方が他方を選ぶのかについての良い説明。
Sablefoste

4

cdhowieからの上記の回答の1つは、機能させることができなかったので採用しました。これでうまくいくようです。UNIX_TIMESTAMP関数を使用してこれを行うことも可能だと思います。

SELECT * FROM your_table

WHERE UNIX_TIMESTAMP(DateVisited) >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND UNIX_TIMESTAMP(DateVisited) <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.