【问题标题】:saving a VB timespan value in SQL database在 SQL 数据库中保存 VB 时间跨度值
【发布时间】:2013-03-06 16:42:34
【问题描述】:

我可以存储什么数据类型超过 24 小时的 VB 时间跨度? 以下内容不会保存为 SQL 时间跨度值。

Dim span As TimeSpan = New TimeSpan(1, 2, 0, 30, 0)

输出

1.02:00:30

我希望以后能够对此进行计算。

SqlDbType.Time 溢出。值“1.02:00:30”超出范围。必须介于 00:00:00.0000000 和 23:59:59.9999999 之间。

这个 Fiddler 示例显示了我所追求的结果,我想将结果存储在 SQL 数据库中。
http://sqlfiddle.com/#!3/c7b0d/53

【问题讨论】:

  • SQL Server 没有区间数据类型,因此不清楚您要在这里做什么。数据库方面的一种常见方法是store intervals as integers,即滴答数、秒数或分钟数或您需要的任何粒度。然后,您可以在应用程序中随意格式化它。或者,您可以存储间隔的开始和结束时间。
  • 用示例更新了帖子。
  • 正如documentation 所说,time 数据类型存储一天中的某个时间,而不是一段时间(间隔)。因此,最好的选择可能是存储秒数,这使得计算变得容易。但是将秒数转换为特定的字符串格式以进行输出(这是您的 SQL Fiddle 所做的)通常应该在应用程序中完成,而不是在数据库中。
  • 我同意你的看法,@Pondlife,你应该这样回答。
  • 嗯,它是在代码中完成的,开头句子中所述的问题是“我可以将值存储为什么数据类型并仍然用它计算?”我确实了解时间类型的限制,错误清楚地说明了这一点。希望有一些想法或建议来实现目标。

标签: sql-server vb.net timespan


【解决方案1】:

我最初建议使用 SQL Server 2008“datetimeoffset”数据类型,但这是错误的。

正如之前的 cmets 正确指出的那样,目前 SQL Server 中没有自然存储和处理时间跨度值的数据类型。

最简单的替代方法是将偏移存储为浮点值,其中整数部分表示天,小数部分表示一天的部分。这将允许简单的计算。数学可以如下进行:

select 
    getdate(),                                          -- Current datetime
    CONVERT(date, getdate()),                           -- Current date
    CONVERT(datetime, CONVERT(date, getdate())) +1,     -- Add one day
    CONVERT(datetime, CONVERT(date, getdate())) +1.75   -- Add a day + 3/4 or 18 hours
    getdate() + .75,                                    -- Current Time + 18 hours.
    getdate() + (3/4)                                   -- Current Time + 18 hours.

注意:您只能使用 [datetime] 数据类型进行这种日期时间数学运算。因此需要将 [date] 数据类型转换回 [datetime]。

【讨论】:

  • 我认为您错过了我的问题的重点,我试图仅在跨度中存储总时间。不是日历日。
  • 我理解你的问题,但我的回答完全错误。我将 MSSqlServer [datetimeoffset] 数据类型与 MySQL [Time] 数据类型混为一谈,这与 MSSQL [Time] 数据类型不同。我会重写我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
相关资源
最近更新 更多