Sql 向时间间隔添加偏移量
我在表时区中有两列Interval和Offset,数据如下所示: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
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