2

次の列を含むテーブルがあります。

ip(varchar 255), index(bigint 20), time(timestamp)

そこに何かが挿入されるたびに、時刻列に現在のタイムスタンプが取得されます。過去 24 時間に追加されたすべての行を返すクエリを実行したいと考えています。これは私が実行しようとしているものです:

SELECT ip, index FROM users WHERE ip = 'some ip' AND TIMESTAMPDIFF(HOURS,time,NOW()) < 24

そして、それは機能しません。

4

5 に答える 5

4

HOURS は HOUR である必要があります。パラメータの有効な値を確認するには、TIMESTAMPADDのドキュメントを参照してください。unit

TIMESTAMPADD(単位,間隔,datetime_expr)

整数式 interval を日付または日時式 datetime_expr に追加します。interval の単位は unit 引数で指定します。これは、FRAC_SECOND (マイクロ秒)、SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER、または YEAR のいずれかの値にする必要があります。

したがって、クエリは次のようになります。

SELECT ip, index
FROM   users
WHERE  ip = 'some ip'
AND    TIMESTAMPDIFF(HOUR, time, NOW()) < 24

また、このクエリでは、インデックスが存在する場合でも、それを時間どおりに利用できないことに注意してください。次のようにクエリを書き直すと、より効率的になります。

SELECT ip, index
FROM   users
WHERE  ip = 'some ip'
AND    time > NOW() - interval 1 day
于 2010-05-17T12:03:02.890 に答える
1

mysqlの日時関数を使う

SELECT something FROM tbl_name
    WHERE DATE_SUB(CURDATE(),INTERVAL 1 DAY) <= time;
于 2010-05-17T12:04:42.287 に答える
1

逆に考えるといいかもしれません。毎回から 24 時間を引くのではなく、24 時間前 (1 回) の時間を計算し、それに対して時間の値を確認します。私はmySqlにあまり慣れていませんが、おそらくより最適です

SELECT ip, index FROM users WHERE ip = 'some ip' AND time > DATE_SUB(NOW(), HOUR, 24)
于 2010-05-17T12:09:58.630 に答える
1
SELECT ip, index
FROM users
WHERE ip = 'some ip'
AND time >= NOW() - INTERVAL 24 HOUR

これは、テーブルに「将来」の時間がないことを前提としています。ある場合は、これを where 句に追加します。

AND time <= NOW()
于 2010-05-17T12:10:30.343 に答える
0

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_timediffから

TIMESTAMPADD(単位,間隔,datetime_expr)

整数式 interval を日付または日時式 datetime_expr に追加します。interval の単位は unit 引数で指定します。これは、FRAC_SECOND (マイクロ秒)、SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER、または YEAR のいずれかの値にする必要があります。

MySQL 5.1.24 から、この関数で FRAC_SECOND の代わりに MICROSECOND を使用できるようになり、FRAC_SECOND は非推奨になりました。FRAC_SECOND は MySQL 5.5 で削除されました。

単位の値は、示されているキーワードの 1 つを使用するか、SQL_TSI_ のプレフィックスを使用して指定できます。たとえば、DAY と SQL_TSI_DAY はどちらも有効です。

mysql> SELECT TIMESTAMPADD(MINUTE,1,'2003-01-02');

-> '2003-01-02 00:01:00'

mysql> SELECT TIMESTAMPADD(WEEK,1,'2003-01-02');

-> '2003-01-09'

そう ...

SELECT TIMESTAMPADD(DAY,-1,CURRENT_TIMESTAMP());

あなたが望むものであるべきです

于 2010-05-17T12:07:02.400 に答える