Sql 向时间间隔添加偏移量

Sql 向时间间隔添加偏移量,sql,sql-server,tsql,sql-server-2008,datetime,Sql,Sql Server,Tsql,Sql Server 2008,Datetime,我在表时区中有两列Interval和Offset,数据如下所示: Interval Offset 730 60 830 60 1000 60 我也在尝试从这些文章中获得第三个专栏,它会给我这样的感觉: Interval Offset Interval_Offset 730 60

我在表时区中有两列Interval和Offset,数据如下所示:

Interval             Offset
730                  60
830                  60
1000                 60
我也在尝试从这些文章中获得第三个专栏,它会给我这样的感觉:

Interval             Offset        Interval_Offset
730                  60            0830 
830                  60            0930
1000                 60            1100

select CONVERT(INT, interval / 100) + OFFSET / 60 
from Timezone
我只有一小时,但没有一分钟


有人能帮我吗?

为了准确计算小时数,你必须先将时间转换为小时,然后再转换为分钟,如下所示:

with q1 as (
  select 730 interval, 60 offset
  union all
  select 830, 60
  union all
  select 1000, 60
  union all 
  select 1145, 30
  union all
  select 1130, 90
  ),
  q2 as (
  select interval, offset
         ,  interval / 100 int_hour
         , (interval % 100) + offset int_minute
    from q1
  )  
select interval, offset
       , (int_hour + int_minute / 60) * 100 + (int_minute % 60) result_hour
  from q2    
结果是:

interval    offset      result_hour
730         60          830
830         60          930
1000        60          1100
1145        30          1215
1130        90          1300

我添加了几个值,以显示它在不同的时间间隔内运行良好。当然,这仍然是有限的,如果它适用于您,则取决于我们对您面临的问题所不了解的内容。

由于间隔是一种时间类型(根据您的注释),您可以使用DATEADD():


日期和时间的数学是出了名的难。我建议您使用正确的数据类型(即,因为您使用的是SQL 2008,所以请为间隔列使用时间类型),然后使用dateadd向其添加偏移量。

一些数学知识

create table TimeZone (interval int, offset int)
insert TimeZone values
(730, 60),
(830, 60),
(1000, 60);

select
    interval, offset,
    ((interval+offset+40)/100)*100 + ((interval+OFFSET)%100)%60 Interval_Offset
from Timezone
输出

interval    offset      Interval_Offset
----------- ----------- ---------------
730         60          830
830         60          930
1000        60          1100
另一方面,如果
interval
是日期时间列,则可以使用

create table TimeZone (interval datetime, offset int)
insert TimeZone values ('7:30', 60), ('8:30', 60), ('10:00', 60);

select
    interval,
    convert(char(5),interval,8) Interval_display,
    offset,
    dateadd(mi, offset, interval) Interval_Offset,
    convert(char(5),dateadd(mi, offset, interval),8) Interval_Offset_display
from Timezone
输出(第2列和第5列以HH:MM格式显示时间)


这些列是什么意思?间隔是一段时间吗?秒?分钟小时?什么是补偿?Interval\u Offset是什么?@Abe Miessler Interval是时间,Offset是分钟您是否将一天中的时间作为整数存储在“Interval”列中?@Catcall Interval是varchar,Offset是int类型Interval是varchar数据类型。当我执行你的代码时,它会给我间隔(730)偏移量(60)间隔偏移量(790),但我希望间隔偏移量是间隔偏移量(830)@Sam你用了哪一个?第一个变量即使在varchar的interval中也可以使用,只要所有的varchar只包含int。请注意,我没有使用A+B,而是使用(A+40+B)/。。。将790推到830。@Sam/此外,直接整数数学比两次转换为datetime、执行date数学、转换为char然后最终执行replaceInterval要快得多datetime@Sam-在您对原始问题的评论中,您表示是时候了,我想你的意思是SQL类型“time”。我有数千条记录需要进行此计算。所以我认为我不能使用这个代码。@Sam-没有什么区别。代码仍然有效。无论在何处使用,您都将得到从varchar到int的隐式转换。改为使用显式转换更新答案。它提供了正确的输出,但不是我得到的格式输出为02:30,但我希望输出为0230@Sam-使用
replace
删除
。更新的答案。内联的呢?比如“从您的_表中选择dateadd(分钟、偏移、转换(时间、间隔))?
create table TimeZone (interval datetime, offset int)
insert TimeZone values ('7:30', 60), ('8:30', 60), ('10:00', 60);

select
    interval,
    convert(char(5),interval,8) Interval_display,
    offset,
    dateadd(mi, offset, interval) Interval_Offset,
    convert(char(5),dateadd(mi, offset, interval),8) Interval_Offset_display
from Timezone
interval                Interval_display offset      Interval_Offset         Interval_Offset_display
----------------------- ---------------- ----------- ----------------------- -----------------------
1900-01-01 07:30:00.000 07:30            60          1900-01-01 08:30:00.000 08:30
1900-01-01 08:30:00.000 08:30            60          1900-01-01 09:30:00.000 09:30
1900-01-01 10:00:00.000 10:00            60          1900-01-01 11:00:00.000 11:00
declare @T table (interval varchar(4), offset int)

insert @T values
('730', 60),
('830', 60),
('1000', 60);

select
  interval,
  offset,
  replace(convert(char(5), dateadd(mi, convert(int, interval) % 100 + offset, dateadd(hour, convert(int, interval) / 100, 0)), 8),':','')
from @T