MySql
またはPostgreSql
(またはその他の好奇心から)のタイムスタンプからミリ秒を取得する方法はありますか?
SELECT CURRENT_TIMESTAMP
--> 2012-03-08 20:12:06.032572
このようなものはありますか:
SELECT CURRENT_MILLISEC
--> 1331255526000
または、唯一の選択肢は、DATEDIFF
からera
を使用することです。
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() ) );
MySQL(5.6+)の場合、これを実行できます。
SELECT ROUND(UNIX_TIMESTAMP(CURTIME(4)) * 1000)
返される(例):
1420998416685 --milliseconds
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
Mysql 5.7+では実行できます
select current_timestamp(6)
詳細については
https://dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html
現在のドキュメント に従ってPostgreSQLのタイムスタンプ値からミリ秒を抽出する正しい方法は次のとおりです。
SELECT date_part('milliseconds', current_timestamp);
--OR
SELECT EXTRACT(MILLISECONDS FROM current_timestamp);
戻り値:小数部を含む秒フィールド、1000倍。完全な秒が含まれることに注意してください。
タイムスタンプを使用した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の実際に使用可能なタイムスタンプ精度はプラットフォームに依存します。
つかいます:
Select curtime(4);
これにより、ミリ秒が得られます。
PostgreSQLでは次を使用できます。
SELECT extract(Epoch from now());
mySQLの場合:
SELECT unix_timestamp(now());
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も機能します)。
これらの応答はどれも問題を実際に解決しませんpostgreSQLで、つまり:
日付フィールドのnixタイムスタンプの取得ミリ秒単位
私は同じ問題を抱えており、結果を満足させることなく、以前のさまざまな応答をテストしました。
最後に、おそらく最も簡単な、本当に簡単な方法を見つけました。
SELECT (EXTRACT (Epoch FROM <date_column>::timestamp)::float*1000 as unix_tms
FROM <table>
すなわち:
MySqlでミリ秒単位で現在の時刻を受け取ることがわかった最も簡単な方法:
SELECT (UNIX_TIMESTAMP(NOW(3)) * 1000)
MySql 5.6以降。
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)
PostgreSQLでは、このアプローチを使用します。
SELECT round(EXTRACT (Epoch FROM now())::float*1000)
ミリ秒に対して次のように実行します。
select round(date_format(CURTIME(3), "%f")/1000)
次の方法でマイクロ秒を取得できます。
select date_format(CURTIME(6), "%f")
最近同じ問題に直面し、現在のタイムスタンプをミリ秒で返す新しい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';
これが役立つことを願っています、シルビウ