使用浮点值以毫秒精度表示日期和时间:
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