web-dev-qa-db-ja.com

CURRENT_TIMESTAMP(ミリ秒)

MySqlまたはPostgreSql(またはその他の好奇心から)のタイムスタンプからミリ秒を取得する方法はありますか?

SELECT CURRENT_TIMESTAMP
--> 2012-03-08 20:12:06.032572

このようなものはありますか:

SELECT CURRENT_MILLISEC
--> 1331255526000

または、唯一の選択肢は、DATEDIFFからeraを使用することです。

59
Gevorg

MySQLでUnixタイムスタンプを秒で取得するには:

select UNIX_TIMESTAMP();

詳細: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_unix-timestamp

PostgreSQLはテストされていませんが、このサイトによると動作するはずです: http://www.raditha.com/postgres/timestamp.php

select round( date_part( 'Epoch', now() ) );
35
Billy Moon

MySQL(5.6+)の場合、これを実行できます。

SELECT ROUND(UNIX_TIMESTAMP(CURTIME(4)) * 1000)

返される(例):

1420998416685 --milliseconds
51
Claudio Holanda

Mysqlでは、uuid関数を使用してミリ秒を抽出することができます。

select conv( 
            concat(
                   substring(uid,16,3), 
                   substring(uid,10,4), 
                   substring(uid,1,8))
                   ,16,10) 
            div 10000 
            - (141427 * 24 * 60 * 60 * 1000) as current_mills
from (select uuid() uid) as alias;

結果:

+---------------+
| current_mills |
+---------------+
| 1410954031133 |
+---------------+

古いmysqlバージョンでも動作します!

このページに感謝します: http://rpbouman.blogspot.com.es/2014/06/mysql-extracting-timstamp-and-mac.html

34
jbaylina

Mysql 5.7+では実行できます

select current_timestamp(6)

詳細については

https://dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html

10
Ahmed

現在のドキュメント に従ってPostgreSQLのタイムスタンプ値からミリ秒を抽出する正しい方法は次のとおりです。

SELECT date_part('milliseconds', current_timestamp);

--OR

SELECT EXTRACT(MILLISECONDS FROM current_timestamp);

戻り値:小数部を含む秒フィールド、1000倍。完全な秒が含まれることに注意してください。

8
Falco

タイムスタンプを使用したMySQLの主な誤解は、MySQLはデフォルトで小数部分のないタイムスタンプを返し、保存するです。

SELECT current_timestamp()  => 2018-01-18 12:05:34

次のように秒のタイムスタンプに変換できます

SELECT UNIX_TIMESTAMP(current_timestamp()) => 1516272429

小数部を追加するには:

SELECT current_timestamp(3) => 2018-01-18 12:05:58.983

マイクロ秒のタイムスタンプに変換できます

SELECT CAST( 1000*UNIX_TIMESTAMP(current_timestamp(3)) AS UNSIGNED INTEGER) ts => 1516272274786

テーブルに保存するコツはほとんどありません。テーブルが次のように作成された場合

    CREATE TABLE `ts_test_table` (
      `id` int(1) NOT NULL,
      `not_fractional_timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

mySQLはその中に小数部分を格納しません。

    id, not_fractional_timestamp
    1,  2018-01-18 11:35:12

テーブルに小数部分を追加する場合は、別の方法でテーブルを作成する必要があります。

    CREATE TABLE `ts_test_table2` (
      `id` int(1) NOT NULL,
      `some_data` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL,
      `fractional_timestamp` timestamp(3) NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

それは必要な結果につながります:

    id, some_data, fractional_timestamp
    1,  8,         2018-01-18 11:45:40.811

current_timestamp()関数は最大6の値を受け取ることができますが、(少なくともWindowsにインストールされているMySQL 5.7.11バージョンでは)小数部精度6が末尾の3桁の同じ定数値につながることがわかりました。私の場合、688

    id, some_data, fractional_timestamp
    1,  2,         2018-01-18 12:01:54.167688
    2,  4,         2018-01-18 12:01:58.893688

つまり、MySQLの実際に使用可能なタイムスタンプ精度はプラットフォームに依存します。

  • windowsの場合:3
  • linuxの場合:6
7
Igor

つかいます:

Select curtime(4);

これにより、ミリ秒が得られます。

6
TanuAD

PostgreSQLでは次を使用できます。

SELECT extract(Epoch from now());

mySQLの場合:

SELECT unix_timestamp(now());
4
aleroot

MariaDBおよびMySQL 5.6以上で機能する式を次に示します。

SELECT (UNIX_TIMESTAMP(NOW()) * 1000000 + MICROSECOND(NOW(6))) AS unix_now_in_microseconds;

これは、 NOW()がクエリ全体で常に同じ時間を返す ;という事実に依存しています。プレーンなUNIX_TIMESTAMP()でも同様に機能する可能性がありますが、よくわかりません ドキュメントに基づいて 。また、NOW()関数の新しい精度引数にMySQL 5.6以上が必要です(MariaDBも機能します)。

4
Walter Mundt

これらの応答はどれも問題を実際に解決しませんpostgreSQLで、つまり:

日付フィールドのnixタイムスタンプの取得ミリ秒単位

私は同じ問題を抱えており、結果を満足させることなく、以前のさまざまな応答をテストしました。

最後に、おそらく最も簡単な、本当に簡単な方法を見つけました。

SELECT (EXTRACT (Epoch FROM <date_column>::timestamp)::float*1000 as unix_tms
FROM <table>

すなわち:

  • PgSQLEpoch、すなわちunix timestampinfloating secondsをタイムスタンプの慎重さでキャストされた列(一部の複雑なクエリでは、このキャストが明示的でない場合、pgSQLはエラーをスローする可能性があります。を参照してください。)
  • 次に、floatにキャストし、1000倍してミリ秒単位の値を取得します
4
Rémi Becheras

MySqlでミリ秒単位で現在の時刻を受け取ることがわかった最も簡単な方法:

SELECT (UNIX_TIMESTAMP(NOW(3)) * 1000)

MySql 5.6以降。

3
Yuval

MySQLの改良を続ける必要があると感じました。

現在のタイムスタンプ(ミリ秒):

floor(unix_timestamp(current_timestamp(3)) * 1000)

指定されたdatetime(3)からのミリ秒単位のタイムスタンプ:

floor(unix_timestamp("2015-04-27 15:14:55.692") * 1000)

ミリ秒単位のタイムスタンプをdatetime(3)に変換します。

from_unixtime(1430146422456 / 1000)

Datetime(3)をミリ秒単位のタイムスタンプに変換します。

floor(unix_timestamp("2015-04-27 14:53:42.456") * 1000)
1
Yaniv

MariaDBでは次を使用できます

SELECT NOW(4);

ミリ秒を取得します。 here も参照してください。

1
Benvorth

PostgreSQLでは、このアプローチを使用します。

SELECT round(EXTRACT (Epoch FROM now())::float*1000)
0
Chebevara

ミリ秒に対して次のように実行します。

select round(date_format(CURTIME(3), "%f")/1000)

次の方法でマイクロ秒を取得できます。

select date_format(CURTIME(6), "%f")
0
Justin Levene

最近同じ問題に直面し、現在のタイムスタンプをミリ秒で返す新しいmysql関数UNIX_TIMESTAMP_MS()を含む小さなgithubプロジェクトを作成しました。

また、次のこともできます。

SELECT UNIX_TIMESTAMP_MS(NOW(3))またはSELECT UNIX_TIMESTAMP_MS(DateTimeField)

プロジェクトはここにあります: https://github.com/silviucpp/unix_timestamp_ms

コンパイルするには、プロジェクトルートでmake compileを実行するだけです。

次に、/usr/lib/mysql/plugin/(またはプラグインフォルダーがマシンにあるもの)の共有ライブラリーのみをコピーする必要があります。

この後、mysqlコンソールを開いて実行するだけです:

CREATE FUNCTION UNIX_TIMESTAMP_MS RETURNS INT SONAME 'unix_timestamp_ms.so';

これが役立つことを願っています、シルビウ

0
silviu