MS SQL如何记录负时间

本文关键字:记录 时间 SQL 何记录 MS | 更新日期: 2023-09-27 17:57:04

我在MS SQL数据库中有一列类型为"TIME"。我需要在其中记录一个负值。它不是两个特定时间或日期之间的范围。它是用于计算的抽象时间值。在实体框架中,它被视为 TimeSpan,MetaData.tt 自动处理数据库中的所有 TIME 定义的列。

例如,我可能有一个任意日历,其中包含星期一凌晨 5 点和晚上 8 点的事件,星期二下午 4 点的事件,之后星期日凌晨 3 点的事件。我可以将值添加到这些时间中,并在事件开始之前(在负时间的情况下)或之后(在正时间的情况下)获得一个时间。

当我尝试写下负值时,数据库拒绝它。

实体到数据库的记录是通过在控制器中直接绑定 post 属性来实现的,所以如果需要将其转换为即时报价,在 Javascript 中这样做是否可靠?我将如何处理它的输入文本框?看起来我无法将值与文本框中的内容分开。如果我必须将其转换为 INT,我就不能再使用它@EditorFor,从而产生另一个错误点,代码变得不那么灵活。

几乎感觉我应该创建新列来表示这些值的消极性,并使用带有隐藏输入的下拉列表而不是文本框。

编辑:为什么要避免非时间类型:

请考虑以下代码:

var typeName = _code.Escape(edmType.MetadataProperties.Where(…).FirstOrDefault());

如果 EDM 属性的类型为 int,则生成的代码将是 int 类型。EDM 属性来自数据库本身,因此如果它不是直接转换为时间的类型,则需要一个新方法(也许在帮助程序中的某个地方),将其转换为时间。这个新方法必须(由团队中的其他人)维护,这意味着一个弱点,因为如果有人更改列名,现在代码不会再次正确生成。

错误

也可能通过错误日志不可用,因为大多数属性也倾向于在某些时候在 javascript 中引用(通常也会生成,现在不能用于此列,因为它是一种特殊情况)。我还在谈论大约 20 列遭受这种痛苦,所以这很有可能迅速变成一个深深纠结的意大利面球。

MS SQL如何记录负时间

看起来

您确实在尝试存储持续时间,而不是时间。 TIME用于存储时间点,而不是时间量。 我会选择一些时间细分(秒、毫秒等),并将其存储为int(如有必要,bigint)。 然后在 SQL Server 中,在尝试计算所需时间时,可以使用 DATEADD(SECOND,@storedValue,@dateToChange) 在 C# 中计算真实时间或DateTime.Add.Milliseconds(storedValue)DateTime.Add.Seconds(storedValue)等。

如果我错过了什么,请告诉我。

在这些情况下,我想我会同时存储开始和结束时间,并使用 DATEDIFF 使用另一个计算列来存储差异(使用 INT 数据类型):

CREATE TABLE dbo.MyTable
(
  Time1 time
  Time2 time
  timedifference AS DATEDIFF(Second, Time1,Time2)
);

然后,您可以将秒转换为一天中的时间,如下所示:

SELECT CONVERT(varchar, DATEADD(ms, timedifference * 1000, 0), 114)

以下是您将获得的工作示例:

SELECT CONVERT(varchar, DATEADD(ms, DATEDIFF(Second, CAST('12:24:18.3500000' as time),CAST('11:24:18.3500000' as time)) * 1000, 0), 114)
SELECT CONVERT(varchar, DATEADD(ms, DATEDIFF(Second, CAST('11:24:18.3500000' as time),CAST('12:24:18.3500000' as time)) * 1000, 0), 114)

数据库类型time不支持负值。可接受的范围是00:00:00.000000023:59:59.9999999

https://msdn.microsoft.com/en-us/library/bb677243.aspx