2017-12-22 11 views
1

PHPを使用してMySQLデータベースにアクセスしています。日付がUNIXタイムスタンプとして保存された特定の日付のMySQLフィルタ

表ヘッダー:

  • ID(INT、オートインクリメント)、プロファイルID、タイムスタンプ

表含量:

  • 1、私はこのような構築テーブルを持っています12345678,1513814399(= 12/21/2017)
  • 2,13451983,1513814400(= 12/21/2017)
  • 3、12345678、1513944000(= 2017年12月22日)
  • 4、12345678、1513944001(= 2017年12月22日)

は、profileIDはれるウェブサイトの訪問者によって呼び出されたテーブルショー時間。

私の質問は今のところどのように表示できるのですか? "この場合は" 12/22/2017に呼び出されたプロファイル番号12345678のエントリ数を教えてください " 。

私はこのクエリでそれを試してみました:

SELECT COUNT(profileid), from_unixtime(timestamp, '%d') AS day, from_unixtime(timestamp, '%m') as month, from_unixtime(timestamp, '%Y') as year WHERE profileid='12345678' AND day=22 AND month=12 AND year=2017; 

しかし、彼らはテーブルに存在しないことがあるため、「日」、「月」の列にアクセスすることはできませんし、「年」。

誰かに私にこのことを伝える方法を教えてもらえますか?もう1つの方法は、3つの新しい列(timestamp_day、timestamp_month、timestamp_year)を作成することですが、それは素晴らしい解決策ではありません。

ありがとうございます!

テハ

+0

「タイムスタンプ」フィールドにはどのようなデータ型がありますか?なぜそれを "日付"として直接設定しないのですか?あなたが望むように変換が必要なフォーマットで保存する必要はないようです。 –

+0

MySQLには、日付フィールドに適用できる 'DAY()'、 'MONTH()'、 'YEAR()などの日付関数があります。 'https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html –

+0

ご意見ありがとうございます。整数型です。私はそれが正直であることに慣れているので、それは好きです。時間差を計算するのはいいことです。 – teha

答えて

3

ちょうど日付を生成してください。私は、あなたがしたいと思う:

SELECT COUNT(profileid) 
FROM t 
WHERE DATE(from_unixtime(timestamp)) = '2017-12-22' AND 
     profileid = '12345678'; 

私はこれを書くことは、より傾斜のようになります。これは、クエリはt(profileid, timestamp)にインデックスをフルに活用することができます

SELECT COUNT(profileid) 
FROM t 
WHERE profileid = '12345678' AND 
     timestamp >= UNIX_TIMESTAMP('2017-12-22') AND 
     timestamp < UNIX_TIMETAMP('2017-12-23'); 

+0

これは素晴らしいですね。このようなことが可能であるかどうかはわかりませんでした。私はそれをテストし、あなたにフィードバックを与えます! – teha

0

MONTH、およびYEARの機能とFROM_UNIXTIMEを組み合わせて使用​​できます。

SELECT COUNT(profileid) 
WHERE profileid='12345678' 
AND DAY(FROM_UNIXTIME(timestamp))=22 
AND MONTH(FROM_UNIXTIME(timestamp))=12 
AND YEAR(FROM_UNIXTIME(timestamp))=2017; 
0

ここにはいくつかのものがあります。

  1. rawタイムスタンプをでMySQL TIMESTAMPオブジェクトに変換することができます。あなたはすでにそれを知っています。
  2. TIMESTAMPを取得したら、その上であらゆる種類の日付機能を使用できます。
  3. UNIX_TIMESTAMP()
  4. を使用して別の方向に変換することができます。ある日のレコードを検索する場合、日付範囲の検索ができます。

だからあなたのクエリは、多分、次の日の真夜中を含めないまでしかし、あなたが希望の日にすべてのタイムスタンプ値をピックアップする

SELECT COUNT(*) cnt 
    FROM t 
    WHERE profileid = '12345678' 
     AND timestamp >= UNIX_TIMESTAMP('2017-12-22') 
     AND timestamp < UNIX_TIMESTAMP('2017-12-23') 

でなければなりません。 (profileid, timestamp)にインデックスがある場合、この種のクエリは高速になります。

はあなたにも

SELECT COUNT(*) cnt, profileid 
    FROM t 
    WHERE timestamp >= UNIX_TIMESTAMP('2017-12-22') 
     AND timestamp < UNIX_TIMESTAMP('2017-12-23') 
    GROUP BY profileid 

を行うと、その日のためにすべてのプロファイルIDの数を示す結果セットを取得することができます。そして、あなたはできます

SELECT COUNT(*) cnt, profileid, DATE(FROM_UNIXTIME(timestamp)) day 
    FROM t 
    WHERE timestamp >= UNIX_TIMESTAMP('2017-11-01') 
     AND timestamp < UNIX_TIMESTAMP('2017-12-01') 
    GROUP BY profileid, DATE(FROM_UNIXTIME(timestamp)) 

そして11月のすべてを得る。

あなたはこの

SELECT COUNT(*) cnt, profileid, LAST_DAY(FROM_UNIXTIME(timestamp)) month_ending 
    FROM t 
    WHERE timestamp >= UNIX_TIMESTAMP('2017-01-01') 
     AND timestamp < UNIX_TIMESTAMP('2018-01-01') 
    GROUP BY profileid, LAST_DAY(FROM_UNIXTIME(timestamp)) 

を行うと、通年の月ごとの要約を得ることができます。

日付演算が便利です。そのため、多くのテーブル設計では、生の整数のタイムスタンプではなく、DATETIMETIMESTAMPのような実際の日付スタンプのようなフィールドが使用されます。

関連する問題