gpt4 book ai didi

c# - 操作数数据类型时间对于添加运算符无效

转载 作者:行者123 更新时间:2023-11-30 15:33:22 25 4
gpt4 key购买 nike

我有下表:

                  SHIFT
----------------------------------------
| SHIFT_ID | SHIFT_TIME | SHIFT_DURATION |
| -------------------------------------- |
| 1 | 00:00:00 | 01:00:00 |
| 2 | 01:00:00 | 01:00:00 |
| 3 | 02:00:00 | 01:00:00 |
----------------------------------------

此处,SHIFT_TIMESHIFT_DURATION 的类型为 TimeSpan

现在,当我运行以下查询时:

var query = from c in SHIFT
where c.SHIFT_TIME + c.SHIFT_DURATION >=
new TimeSpan(DateTime.Now.Hour,
DateTime.Now.Minute,
DateTime.Now.Second)
select c;

我收到以下错误:Operand data type time is invalid for add operator.

为什么要这样做?我怎样才能避免这个错误?

编辑:我尝试同时使用 .Add().CompareTo() 都无济于事。

最佳答案

我看到了一些问题。

让我们从这里开始:

new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second)

多次调用 DateTime.Now 绝不是一个好主意。您正在读取系统时钟三次。此外,已经有一个用于此确切目的的属性,因此您可以这样做:

DateTime.Now.TimeOfDay

下一个问题:

c.SHIFT_TIME + c.SHIFT_DURATION

如果轮类时间是晚上 11:00,并且持续时间是 2 小时,您可能预计是凌晨 1:00,但实际是 25 小时。 (实际上你会得到“1 天 1 小时”。)所以当你查看一天中的某个时间(例如凌晨 12:30)时,你可能会得到与预期不同的结果。

下一个问题:

你没有提到这一点,但看起来你实际上是在使用 LINQ-to-Entities,作为 Entity Framework 的一部分,附加到 SQL Server。 (我更新了你的标签。)我可以告诉你,因为你收到的错误消息实际上是一条 SQL Server 错误消息。您可以像这样在 SQL Server Management Studio 中重现它:

declare @t1 time, @t2 time
set @t1 = '1:00'
set @t2 = '1:00'
print @t1 + @t2

Msg 8117, Level 16, State 1, Line 4
Operand data type time is invalid for add operator.

虽然您可以在 .Net 中添加两个 TimeSpan 类型,但您不能在 SQL Server 中添加两个 time 类型。这是因为 time 表示一天中的某个时间,而 TimeSpan 主要表示测量的时间长度。 (从技术上讲,我上面提到的 DateTime.TimeOfDay 属性违背了 TimeSpan 类型的设计目的,但它是允许的,因为没有 Time 输入 .Net。)

所以当你在做你原来的查询时,time 类型的列被加在一起,这是不允许的。 time类型的最大值是23:59:59.9999999,所以不可能得到我前面提到的25小时的结果。

要做什么?

要在 SQL 查询中操作日期和时间,您需要使用 EntityFuntions 的方法或 SqlFunctions类。这些将在您的查询中转换为 SQL 的 native 函数。

我相信这会满足您的需求:

var query = from c in SHIFT
where EntityFunctions.AddMinutes(c.SHIFT_TIME,
EntityFunctions.DiffMinutes(TimeSpan.Zero, c.SHIFT_DURATION))
>= DateTime.Now.TimeOfDay
select c;

这将构建一个类似于以下的 sql 查询(假设现在是 1:00):

SELECT * FROM SHIFT WHERE DATEADD(minute,
DATEDIFF(minute, 0, SHIFT_DURATION),
SHIFT_TIME
) >= '1:00'

SQL Server 会将 time 输入类型隐式转换为 datetime,因此它可以与 DATEADD 函数一起使用。它还会将结果转换回 time 类型,因此您可以将其与您提供给查询的“现在”时间进行比较。

关于c# - 操作数数据类型时间对于添加运算符无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17578852/

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