CURRENT_TIMESTAMP in milliseconds

后端 未结 19 883
失恋的感觉
失恋的感觉 2020-12-07 23:48

Is there any way to get milliseconds out of a timestamp in MySql or PostgreSql (or others just out of curiosity)?

SELECT CURRENT_TI         


        
相关标签:
19条回答
  • 2020-12-08 00:19

    For mysql:

    SELECT (UNIX_TIMESTAMP() * 1000) AS unix_now_in_microseconds; --- 1600698677000
    
    0 讨论(0)
  • 2020-12-08 00:19

    I felt the need to continue to refine, so in MySQL:

    Current timestamp in milliseconds:

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

    Timestamp in milliseconds from given datetime(3):

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

    Convert timestamp in milliseconds to datetime(3):

    from_unixtime(1430146422456 / 1000)
    

    Convert datetime(3) to timestamp in milliseconds:

    floor(unix_timestamp("2015-04-27 14:53:42.456") * 1000)
    
    0 讨论(0)
  • 2020-12-08 00:19

    For everyone here, just listen / read the comments of Doin very good! The UNIX_TIMESTAMP() function will, when a datatime-string is given, contact a local time, based on the timezone of the MySQL Connection or the server, to a unix timestamp. When in a different timezone and dealing with daylight savings, one hour per year, this will go wrong!

    For example, in the Netherlands, the last Sunday of October, a second after reaching 02:59:59 for the first time, the time will be set back to 02:00:00 again. When using the NOW(), CURTIME() or SYSDATE()-functions from MySQL and passing it to the UNIX_TIMESTAMP() function, the timestamps will be wrong for a whole our.

    For example, on Satudray 27th of October 2018, the time and timestamps went like this:

    Local time                        |  UTC Time                 |  Timestamp   |  Timestamp using MYSQL's UNIX_TIMESTAMP(NOW(4))
    ----------------------------------+---------------------------+--------------+-----------------------------------------------------
    2018-10-27 01:59:59 CET (+02:00)  |  2018-10-26 23:59:59 UTC  |  1540598399  |  1540598399
    2018-10-27 02:00:00 CET (+02:00)  |  2018-10-27 00:00:00 UTC  |  1540598400  |  1540598400 + 1 second
    2018-10-27 02:59:59 CET (+02:00)  |  2018-10-27 00:59:59 UTC  |  1540601999  |  1540601999 
    2018-10-27 03:00:00 CET (+02:00)  |  2018-10-27 01:00:00 UTC  |  1540602000  |  1540602000 + 1 second
    2018-10-27 03:59:59 CET (+02:00)  |  2018-10-27 01:59:59 UTC  |  1540605599  |  1540605599
    2018-10-27 04:00:00 CET (+02:00)  |  2018-10-27 02:00:00 UTC  |  1540605600  |  1540605600 + 1 second
    

    But on Sunday 27th of October 2019, when we've adjusted the clock one hour. Because the local time, doensn't include information whether it's +02:00 or +01:00, converting the time 02:00:00 the first time and the second time, both give the same timestamp (from the second 02:00:00) when using MYSQL's UNIX_TIMESTAMP(NOW(4)) function. So, when checking the timestamps in the database, it did this: +1 +1 +3601 +1 +1 ... +1 +1 -3599 +1 +1 etc.

    Local time                        |  UTC Time                 |  Timestamp   |  Timestamp using MYSQL's UNIX_TIMESTAMP(NOW(4))
    ----------------------------------+---------------------------+--------------+-----------------------------------------------------
    2019-10-27 01:59:59 CET (+02:00)  |  2019-10-26 23:59:59 UTC  |  1572134399  |  1572134399
    2019-10-27 02:00:00 CET (+02:00)  |  2019-10-27 00:00:00 UTC  |  1572134400  |  1572138000 + 3601 seconds
    2019-10-27 02:59:59 CET (+02:00)  |  2019-10-27 00:59:59 UTC  |  1572137999  |  1572141599
    2019-10-27 02:00:00 CET (+01:00)  |  2019-10-27 01:00:00 UTC  |  1572138000  |  1572138000 - 3599 seconds
    2019-10-27 02:59:59 CET (+01:00)  |  2019-10-27 01:59:59 UTC  |  1572141599  |  1572141599
    2019-10-27 03:00:00 CET (+01:00)  |  2019-10-27 02:00:00 UTC  |  1572141600  |  1572141600 + 1 second
    

    Relaying on the UNIX_TIMESTAMP()-function from MySQL when converting local times, unfortunately, is very unreliable! Instead of using SELECT UNIX_TIMESTAMP(NOW(4)), we're now using the code below, which seams to solve the issue.

    SELECT ROUND(UNIX_TIMESTAMP() + (MICROSECOND(UTC_TIME(6))*0.000001), 4)
    
    0 讨论(0)
  • 2020-12-08 00:20

    I faced the same issue recently and I created a small github project that contains a new mysql function UNIX_TIMESTAMP_MS() that returns the current timestamp in milliseconds.

    Also you can do the following :

    SELECT UNIX_TIMESTAMP_MS(NOW(3)) or SELECT UNIX_TIMESTAMP_MS(DateTimeField)

    The project is located here : https://github.com/silviucpp/unix_timestamp_ms

    To compile you need to Just run make compile in the project root.

    Then you need to only copy the shared library in the /usr/lib/mysql/plugin/ (or whatever the plugin folder is on your machine.)

    After this just open a mysql console and run :

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

    I hope this will help, Silviu

    0 讨论(0)
  • 2020-12-08 00:22

    In PostgreSQL you can use :

    SELECT extract(epoch from now());
    

    on MySQL :

    SELECT unix_timestamp(now());
    
    0 讨论(0)
  • 2020-12-08 00:24

    In mysql, it is possible to use the uuid function to extract milliseconds.

    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;
    

    Result:

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

    It also works in older mysql versions!

    Thank you to this page: http://rpbouman.blogspot.com.es/2014/06/mysql-extracting-timstamp-and-mac.html

    0 讨论(0)
提交回复
热议问题