我在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
我只得到一小时而不是一分钟。
任何人都可以帮助我吗?
答案 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