如何在 SQL 数据库中以毫秒精度存储日期时间



使用浮点值以毫秒精度表示日期和时间:

import datetime
float_time = 1485538757.29289
print datetime.datetime.fromtimestamp(float_time) 

指纹:

2017-01-27 09:39:17.292890

要将其存储在数据库中:

from sqlalchemy import Column, DateTime
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class MyTable(Base):
    __tablename__ = 'mytable'
    time_created = Column(DateTime, nullable=False)

但是保存的值向下舍入为 2017-01-27 09:39:17(从 2017-01-27 09:39:17.292890 开始)。有解决方案吗?

这取决于您使用的 SQL 数据库。它们的精度不同:

PostgreSQL:默认为1微秒。(有关遥远的未来/过去的注意事项,请参阅文档。

MySQL:默认为 1 秒。毫秒/微秒精度可选后版本5.6.4

MariaDB:默认 1 秒。自版本 5.3 起可选毫秒/微秒精度。

Transact-SQL(Microsoft SQL):四舍五入为 .000、.003 或 .007 秒的增量

SQLite:日期时间可以存储为任意精度的字符串,但"只有前三位数字是有效的"。

预言机:默认为 1 微秒。可选精度为 1 纳秒。

注意:

  • 毫秒:0.001s
  • 微秒:0.000001s
  • 纳秒:0.000000001s

最重要的信息是你在原始帖子中遗漏的信息:哪个数据库?既然你后来提到它是MariaDB,那么在这里你去:

来源: https://mariadb.com/kb/en/mariadb/microseconds-in-mariadb/

从MariaDB 5.3开始,TIME,DATETIME和TIMESTAMP类型以及 时态函数 CAST 和动态列支持 微秒。可以在以下情况下指定列的日期时间精度 使用 CREATE TABLE 创建表,例如:

CREATE TABLE example(   col_microsec DATETIME(6),   col_millisec TIME(3) );

通常,可以为任何时间指定精度, 日期时间或时间戳列,在类型名称后面的括号中。 日期时间精度指定小数点后的位数 点,可以是 0 到 6 之间的任何整数。如果没有精度 出于向后兼容性原因,指定它假定为 0。

再比如:

SELECT CAST('2009-12-31 23:59:59.998877' as DATETIME(3));
-> 2009-12-31 23:59:59.998

将 sqlalchemy 与 SQLite 一起使用时,默认的 DateTime 列类型不存储秒的小数部分。相反,您必须使用 SQLite 方言 DATETIME 类型:https://docs.sqlalchemy.org/en/14/dialects/sqlite.html#sqlalchemy.dialects.sqlite.DATETIME

最新更新