伙计们,事情是这样子的。就在这两天同事说,你postgresql 中存储的时间怎么带毫秒,然而你的前端界面显示的数据怎么毫秒都是000。我惊讶了!界面打开一看确实是的。
我写的sql 语句为
SELECT "ID", "EventEnum", "Type","OccurTime", "Level","Source" , "Description" FROM
"EventManager" where "OccurTime" >='20240111 000000' and "OccurTime" <='20240111 235959'
and (FALSE OR "Level"='Alarm' OR "Level"='Warning' OR "Level"='Information' ) order
by "OccurTime" DESC limit 2000 offset 0;
数据库查询出来的数据为
可以看到时间字段OccurTime 确实带有毫秒。
然后通过npgsql 查询出来的结果如下
时间字段不带有毫秒。
于是我就开始大量的查资料,可能是我用的npgsql 的版本太低了吗?因为项目原因,不能更换新版本。下面我提供了一个文档的链接。里面详细说了有关时间的相关设置和操作。感兴趣的小伙伴可以去探究尝试一下。
Date and Time Handling | Npgsql Documentation
其中里面有一个NodaTime ,也许能够解决这个问题。文档里说
“默认情况下,PostgreSQL 日期/时间类型映射到内置的 .NET 类型 (, )。不幸的是,这些内置类型在许多方面都存在缺陷。NodaTime库的创建是为了解决其中的许多问题,如果您的应用程序以最基本的方式处理日期和时间,您应该考虑使用它。”
我目前还没有尝试用它。因为项目不允许加进去。
最终我使用了ToChar ,将时间转化为字符串,然后在通过DateTime 进行转化 。
TO_CHAR("OccurTime", 'YYYY/MM/DD hh24:mi:ss.ms') as "OccurTime"
上边是sql 语句的变化,注意这里的时间格式。mi(分钟),不能写成mm。因为我尝试过了,这样写的结果是错误的。具体原因我没有去仔细研究。
本篇内容旨在记录自己的经历。希望大佬们看到后不要喷我哈。当然这里有很多没有验证的东西。感兴趣的小伙伴可以一起去探索。评论区告诉我你尝试中遇到的问题。期待和大家一起探讨。