データベースの現在時刻をミリ秒まで!MySQL、SQL Server、PostgreSQLでCURRENT_TIMESTAMPを扱うテクニック
MySQL、SQL、PostgreSQLにおけるCURRENT_TIMESTAMPのミリ秒取得方法
MySQL、SQL、PostgreSQLはいずれも、データベース内で現在時刻を取得するための CURRENT_TIMESTAMP
関数を提供しています。しかし、デフォルトではミリ秒情報を含まないため、別途処理が必要となります。以下では、各データベースにおけるミリ秒単位の現在時刻取得方法について解説します。
MySQL
MySQLでは、UNIX_TIMESTAMP()
と NOW()
関数を組み合わせて、ミリ秒単位の現在時刻を取得できます。
SELECT UNIX_TIMESTAMP(NOW(3))*1000;
このクエリは、以下の手順で処理されます。
NOW(3)
: 現在時刻を小数点第3位まで取得します。UNIX_TIMESTAMP()
: 引数として渡された時刻を、UNIXエポックからの経過秒数に変換します。* 1000
: 秒数をミリ秒に変換するために、1000を乗算します。
SQL Server
SQL Serverでは、GETDATE()
関数と CONVERT()
関数を組み合わせて、ミリ秒単位の現在時刻を取得できます。
SELECT CONVERT(bigint, GETDATE() * 1000);
GETDATE()
: 現在時刻を取得します。CONVERT(bigint, ...)
: 結果をbigint型に変換します。
PostgreSQL
PostgreSQLでは、date_part()
関数を使用して、CURRENT_TIMESTAMP
からミリ秒情報のみを抽出できます。
SELECT date_part('milliseconds', current_timestamp);
このクエリは、CURRENT_TIMESTAMP
のミリ秒部分のみを抽出します。
- 上記の方法は、あくまでも現在時刻を取得する例です。実際の処理では、取得したミリ秒値をどのように利用するかによって、後続の処理が異なります。
CREATE TABLE test_table (
id INT PRIMARY KEY AUTO_INCREMENT,
current_timestamp_millis BIGINT
);
INSERT INTO test_table (current_timestamp_millis)
VALUES (UNIX_TIMESTAMP(NOW(3))*1000);
SELECT * FROM test_table;
このコードは、以下の処理を行います。
test_table
という名前のテーブルを作成します。このテーブルには、id
列とcurrent_timestamp_millis
列があります。UNIX_TIMESTAMP(NOW(3))*1000
で取得したミリ秒単位の現在時刻をcurrent_timestamp_millis
列に挿入します。test_table
テーブルの内容をすべて選択して表示します。
CREATE TABLE test_table (
id INT PRIMARY KEY AUTO_INCREMENT,
current_timestamp_millis BIGINT
);
INSERT INTO test_table (current_timestamp_millis)
VALUES (CONVERT(bigint, GETDATE() * 1000));
SELECT * FROM test_table;
CREATE TABLE test_table (
id SERIAL PRIMARY KEY,
current_timestamp_millis BIGINT
);
INSERT INTO test_table (current_timestamp_millis)
VALUES (EXTRACT(millisecond FROM current_timestamp));
SELECT * FROM test_table;
注意事項
- 上記のコードはあくまでも例であり、実際の利用状況に合わせて修正する必要があります。
- テーブルの作成やデータの挿入は、データベースの管理者権限を持つユーザーのみが実行できます。
SELECT to_timestamp(current_timestamp, format='YYYY-MM-DD HH:MM:SS.SSS') * 1000;
current_timestamp
: 現在時刻を取得します。to_timestamp(...)
: 引数として渡された文字列を、時刻値に変換します。この場合、フォーマット文字列'YYYY-MM-DD HH:MM:SS.SSS'
を指定することで、ミリ秒までを含む文字列に変換します。
extract() 関数と current_timestamp() 関数を組み合わせて使用する
SELECT extract(epoch from current_timestamp) * 1000 + extract(millisecond from current_timestamp);
extract(epoch from current_timestamp)
:current_timestamp
をUNIXエポックからの経過秒数に変換します。extract(millisecond from current_timestamp)
:current_timestamp
のミリ秒部分のみを抽出します。+
: 1. と 2. の結果を足し合わせます。
PostgreSQL 10以降では、clock_timestamp()
関数を使用して、より高精度なミリ秒単位の現在時刻を取得することができます。
SELECT clock_timestamp() * 1000;
このクエリは、current_timestamp()
関数よりも高精度なミリ秒単位の現在時刻を取得します。
各方法の比較
方法 | 利点 | 欠点 |
---|---|---|
UNIX_TIMESTAMP() と NOW() 関数を使用する | シンプルで分かりやすい | 比較的古い方法 |
to_timestamp() 関数を使用する | 書式を自由に指定できる | やや複雑 |
extract() 関数と current_timestamp() 関数を組み合わせて使用する | シンプル | clock_timestamp() 関数よりも精度が低い |
clock_timestamp() 関数を使用する | 高精度 | PostgreSQL 10以降でのみ利用可能 |
- 上記の方法はいずれも、PostgreSQL 9.2以降で使用できます。
mysql sql postgresql