gpt4 book ai didi

c# - 在 MySQL 和 Entity Framework 6 的 Where 中使用 TimeSpan 时的错误结果

转载 作者:行者123 更新时间:2023-11-29 05:21:00 24 4
gpt4 key购买 nike

我们有表“任务”:

Id | ToTime
1 | 23:59:59

和代码:

TimeSpan currentTime = DateTime.Now.TimeOfDay;
var count = context.Tasks.Where(p => p.ToTime > currentTime).Count();

问题:

理论上,count 应该总是等于 1(在白天)。但这并非如此,因为有时(在随机时间)MySQL 找不到任何行(计数 = 0)。

为什么?

看看答案。花了 5 个小时才找到解决方案。

最佳答案

毫秒

Entity Framework 像这样生成 SQL:

SELECT
`GroupBy1`.`A1` AS `C1`
FROM (SELECT
COUNT(1) AS `A1`
FROM `Tasks` AS `Extent1`
WHERE `Extent1`.`ToTime` > '0 04:24:49.1438543') AS `GroupBy1`

但是 MySQL 只允许 6 位数字表示毫秒。来自 MySQL docs :

A trailing fractional seconds part is recognized in the 'D HH:MM:SS.fraction', 'HH:MM:SS.fraction', 'HHMMSS.fraction', and HHMMSS.fraction time formats, where fraction is the fractional part in up to microseconds (6 digits) precision. Although this fractional part is recognized, it is discarded from values stored into TIME columns.

由于冗余而出现额外的数字 TimeSpan 和 EntityFramework 不会削减这些额外的数字。是的,看起来像一个错误。如果有人知道在哪里举报 - 请举报或在评论中发送链接。

要做什么?

解决方案非常简单。 MySQL 在 Time 中不使用毫秒,只是丢弃它。所以我们可以在请求之前丢弃它。最终代码:

TimeSpan currentTime = DateTime.Now.TimeOfDay;
// Re-creating TimeSpan to discart/cut milliseconds
currentTime = new TimeSpan(currentTime.Hours, currentTime.Minutes, currentTime.Seconds);
var count = context.Tasks.Where(p => p.ToTime > currentTime).Count();

并且生成的 SQL 将始终包含 6 位数字 (000000)。这解决了问题。

错误?

正如我之前所说,这看起来像一个错误。因此,如果您知道在哪里举报 - 请举报或在评论中发送链接。

关于c# - 在 MySQL 和 Entity Framework 6 的 Where 中使用 TimeSpan 时的错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25829140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com