5

unix_timestamp関数を使用して値を返そうとしていますが、動作がおかしいです。

set @currentdate:= UNIX_TIMESTAMP(NOW() + 1000) /* 1339947588 */
set @currentdate:= UNIX_TIMESTAMP(NOW() + 2000) /* 1339948188 */
set @currentdate:= UNIX_TIMESTAMP(NOW() + 3000) /* 1339948788 */

set @currentdate:= UNIX_TIMESTAMP(NOW() + 4000) /* 0 */
set @currentdate:= UNIX_TIMESTAMP(NOW() + 5000) /* 0 */
set @currentdate:= UNIX_TIMESTAMP(NOW() + 6000) /* 0 */
set @currentdate:= UNIX_TIMESTAMP(NOW() + 7000) /* 0 */

set @currentdate:= UNIX_TIMESTAMP(NOW() + 8000) /* 1339949388 */
set @currentdate:= UNIX_TIMESTAMP(NOW() + 9000) /* 1339949988 */
set @currentdate:= UNIX_TIMESTAMP(NOW() + 10000) /* 1339950588 */

4000〜7000の値に対して0の値を返すのはなぜですか?

0を与える間隔は時間の経過とともに変化するため、現在の時間に関連する答えがわかります。理由は何ですか?

前もって感謝します、

4

2 に答える 2

3

これはまったく奇妙なことではありません。NOW()結果を呼び出す前に、結果にいくつかの数値を追加していますUNIX_TIMSETAMP()。 値を追加するUNIX_TIMESTAMP に電話をかけたいと思います。

UNIX_TIMESTAMP(NOW()) + 4000

あるいは単に

UNIX_TIMESTAMP() + 4000

これらは両方とも、現在の時刻に4000秒を追加します。別の解決策は、INTERVALキーワードを使用して、日付に時間単位を追加することです。

NOW() + INTERVAL 4000 SECOND

マニュアルによると、NOW() + 4000が評価されると、NOW()次の形式で数値が返されます。YYYYMMDDHHMMSS.uuuuuuたとえば、20071215235026.000000。これに4000を追加すると、実際の日付に似たものが得られる場合と得られない場合があります。ご覧のとおり、 秒やその他の定義済みエンティティは追加しません。正しい日付を取得するUNIX_TIMESTAMPとタイムスタンプが返され、そうでない場合はが返され0ます。

于 2012-06-17T15:44:38.453 に答える
2

そのようにテストに使用NOW()すると、混乱を招く結果につながる可能性があります。それでは、それを変数に入れましょう:

SET @now=NOW();

それを見てみましょう:

SELECT @now;
-> 2012-06-17 17:42:01

うーん。多分それを数値の文脈で使いたいですか?

SET @now=NOW()+0;
SELECT @now;
-> 20120617174201
SELECT UNIX_TIMESTAMP(@now);
-> 1339947721

ああ。それは何ですか?現在の日時です。2012-06-17 17:42:01、およびそのUNIXタイムスタンプ。

そして今?

SELECT @now + 2000;
-> 20120617176201
SELECT UNIX_TIMESTAMP(@now + 2000);
-> 0

上記のロジックによれば、それはを表し2012-06-17 17:62:01ます。これは無効であり、UNIX_TIMESTAMP()泣き言を言います。

ただし、そうすると、

SELECT @now + 7000;
-> 20120617181201
SELECT UNIX_TIMESTAMP(@now + 7000);
-> 1339949521

2012-06-17 18:12:01再度評価できる有効時間()の範囲に到達します。

于 2012-06-17T15:47:50.977 に答える