将偏移量添加到时间间隔

时间:2011-04-04 22:35:16

标签: sql sql-server tsql sql-server-2008 datetime

我在TimeZone表中有两列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

我只得到一小时而不是一分钟。

任何人都可以帮助我吗?

5 个答案:

答案 0 :(得分:0)

你必须首先转换为小时,然后是分钟才能准确地进行小时算术运算,如下所示:

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

我添加了几个值,以表明它在不同的时间间隔内运行良好。当然这仍然是有限的,如果它适用于你取决于我们不知道你面临的问题...

答案 1 :(得分:0)

由于Interval是时间类型(根据你的评论),你可以使用DATEADD():

SELECT DATEADD(m, Offset, Interval)
FROM Timezone

答案 2 :(得分:0)

日期和时间数学是众所周知的困难。我建议你使用正确的数据类型(即,因为你在SQL 2008上,使用Interval列的时间类型),然后使用dateadd为它添加偏移量。

答案 3 :(得分:0)

一些数学..

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                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

答案 4 :(得分:0)

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