语境
在表值函数中,返回的“表”从 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
和 - a
@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)));