注册

DmProvider1.1.0.16649毫秒精度错误

拳枪临 2023/09/10 1014 3

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DB Version: 0x7000c
【操作系统】:Win11
【CPU】:x86
【问题描述】*:当DATETIME的毫秒部分小于100毫秒时,DmProvider(1.1.0.16649)返回的结果有误!(使用DateTimeOffset时,则连毫秒部分的精度都完全丢失掉)

CREATE TABLE "TST_DT" ( "ID" INT IDENTITY(1, 1) NOT NULL, "DT" DATETIME(6), "DTO" DATETIME(6) WITH TIME ZONE, NOT CLUSTER PRIMARY KEY("ID")); insert into "TST_DT"("DT", "DTO") VALUES(TIMESTAMP '2023-09-11 11:23:55.068000',TIMESTAMP '2023-09-11 11:23:55.068000'); commit;
static void Main(string[] args) { string connStr = "Server=localhost;Port=5236;Database=DMMENG;UID=SYSDBA;PWD=SYSDBA;"; using (var conn = new DmConnection(connStr)) { conn.Open(); var cmd = conn.CreateCommand(); cmd.CommandText = "select ID,DT,to_char(DT,'YYYY-MM-DD HH24:MI:SS.FF3') AS DT_STR,DTO,to_char(DTO,'YYYY-MM-DD HH24:MI:SS.FF3') AS DTO_STR from TST_DT"; var rd = cmd.ExecuteReader(); DataTable dataTable = new DataTable(); dataTable.Load(rd); Console.WriteLine("JSON:"); var json = JsonConvert.SerializeObject(dataTable, Formatting.Indented); Console.WriteLine(json); Console.WriteLine("-----------------"); if (dataTable.Rows.Count > 0) { Console.WriteLine("DateTime:"); var dt = (DateTime)dataTable.Rows[0]["DT"]; Console.WriteLine($"\tMillisecond => {dt.Millisecond}"); Console.WriteLine($"\tToString => {dt.ToString("yyyy-MM-dd HH:mm:ss.ffffff")}"); Console.WriteLine("DateTimeOffset:"); var dto = (DateTimeOffset)dataTable.Rows[0]["DTO"]; Console.WriteLine($"\tMillisecond => {dto.Millisecond}"); Console.WriteLine($"\tToString => {dto.ToString("yyyy-MM-dd HH:mm:ss.ffffff")}"); } } Console.WriteLine("End!"); Console.ReadLine(); }

以下是程序执行结果:

JSON: [ { "ID": 1, "DT": "2023-09-11T11:23:55.68", "DT_STR": "2023-09-11 11:23:55.068", "DTO": "2023-09-11T11:23:55+08:00", "DTO_STR": "2023-09-11 11:23:55.068" } ] ----------------- DateTime: Millisecond => 680 ToString => 2023-09-11 11:23:55.680000 DateTimeOffset: Millisecond => 0 ToString => 2023-09-11 11:23:55.000000 End!

可以看到,如果时间先转换为字符串再返回,结果是符合预期的!但如果是直接查询,则返回的毫秒放大了10倍(继续测试发现,如果毫秒部分超过100毫秒则结果又是正常的。。。)

注:以上测试基于DM8+.NET DmProvider(1.1.0.16649),其他版本未测试

谁可以指点一下问题该怎么解决吗?

回答 0
暂无回答
扫一扫
联系客服