0

したがって、本質的に次の列を持つセッションテーブルがあります。

セッション ID | ユーザーエージェント | last_activity (UNIX タイムスタンプ)

このクエリを使用して、5 分前に作成されたセッションから session_id と last_activity を表示しようとしたとき

SELECT session_id, from_unixtime('last_activity' / 1000, '%Y-%m-%d %H:%i') AS session_time
FROM gw_sessions
WHERE last_activity >= unix_timestamp(CURRENT_TIMESTAMP - INTERVAL 5 MINUTE) * 1000

それは動作しません。

したがって、次のクエリを使用してすべてのセッション (session_id と last_activity) を表示するだけで、クエリを簡素化しようとしました

SELECT session_id, from_unixtime('last_activity' / 1000, '%Y-%m-%d %H:%i') AS session_time
FROM gw_sessions

結果はこのように表示されます

session_id | session_time
abcdefg... --> 1970-01-01 07:00 (epoch)

値が正しく変換されなかったのはなぜですか? また、2 つの日付 (now()) を UNIX 形式で保存された日付と正しく比較するにはどうすればよいですか?

4

1 に答える 1

1

あなたのクエリは正しい情報を返しています。見てみましょう:

SELECT (1367481523) a, (unix_timestamp(CURRENT_TIMESTAMP - INTERVAL 5 MINUTE) * 1000) b;
+------------+---------------+
| a          | b             |
+------------+---------------+
| 1367481523 | 1367483902000 |
+------------+---------------+

あなたが私に言ったように、あなたの last_activity は「a」値です。そして、それは 'b' よりも小さいです。クエリでは、'a' >= 'b' (WHERE last_activity >= unix_timestamp...) のすべてのレコードが必要です。

これまでのところ、クエリは正しいです。多分あなたのロジックは変更する必要があるものです。

[編集]

次に、比較している値がもたらす返された日付を確認してください。

mysql> SELECT 
     from_unixtime(1367481523 / 1000, '%Y-%m-%d %H:%i') a, 
     from_unixtime(1367483902000 / 1000, '%Y-%m-%d %H:%i') b;
+------------------+------------------+
| a                | b                |
+------------------+------------------+
| 1970-01-17 05:51 | 2013-05-02 18:38 |
+------------------+------------------+
1 row in set (0.00 sec)

;-)

于 2013-05-02T08:46:19.843 に答える