【发布时间】:2013-06-21 17:03:02
【问题描述】:
上下文
在表值函数中,返回的“表”从 SELECT 填充到此表:
CREATE TABLE [org].[work_schedule_time](
[id] [int] IDENTITY(1,1) NOT NULL,
[fk_schedule] [int] NOT NULL,
[date_start] [datetime] NOT NULL,
[date_end] [datetime] NOT NULL,
[is_repeating] [bit] NOT NULL,
[repeat_interval] [bigint] NULL,
[repeat_count] [int] NOT NULL,
[is_available] [bit] NOT NULL,
CONSTRAINT [PK_work_schedule_time] PRIMARY KEY CLUSTERED
(
[id] ASC
)
函数接受三个参数:
-
@fkSchedule -
@dateMin和 -
@dateMax用于日期边界
并返回一个包含正确填充日期范围的表格。例如,对于这一行
id fk_schedule date_start date_end is_repeating repeat_interval repeat_count is_available
3 1 2013-06-03 08:00:00.000 2013-06-03 17:00:00.000 1 6048000000000 0 1
这样调用函数
SELECT * FROM [org].[work_schedule_time_fn](1, '2013-06-01', '2013-07-01')
应该返回一个类似的表
schedule_id date_start date_end
1 2013-06-03 08:00:00.000 2013-06-03 17:00:00.000
1 2013-06-10 08:00:00.000 2013-06-10 17:00:00.000
1 2013-06-17 08:00:00.000 2013-06-17 17:00:00.000
1 2013-06-24 08:00:00.000 2013-06-24 17:00:00.000
问题
repeat_interval 列是 bigint,代表 C# TimeSpan。 (表中已有数据,应用逻辑已在使用中。)
我需要调用DATEADD(ms, @repeatInterval / 1000, @dateStart),但我得到了Arithmetic overflow error converting expression to data type int。
我已经阅读了几篇关于它的帖子,但一些答案建议减去 552877920000000000 或其他一些魔术数字,或其他一些巫术技巧。
那么,如果我有一个包含一些刻度的 bigint 值,我需要将其添加到 datetime 列,那么最正确的方法是什么?
谢谢。
最终解决方案
为了避免在滴答数过多时再次溢出,我最终添加了分钟,然后是秒,然后是毫秒。
SET @dateStart = DATEADD(ms, (@repeatInterval % 10000000) / 10000, DATEADD(s, CAST(@repeatInterval / 10000000 as int) % 60, DATEADD(n, CAST(@repeatInterval / 600000000 as int), @dateStart)));
【问题讨论】:
标签: c# sql-server tsql datetime sql-function