我在表格中有两列需要加在一起。 其中之一是带有军事时间的 varchar(4),减去冒号,包括前面的 0。 另一个是 int,它以分钟为单位描述约会的持续时间。 基本上我需要将两者相加并保留为 varchar(4),所有格式都与第一列相同。 我以前使用过SQL,但没有以任何复杂的方式使用。 对此的正确方法是什么? 谢谢!
我不必担心东西会延续到第二天。
例如:
time: '1145'
duration: 45
sum: '1230'
time: '0915'
duration: 30
sum: '0945' (not '945')
假设问题是问题声明时间将始终采用 4 位格式 hhmm。查询从字符串中提取 hh 和 mm 并转换为时间。持续时间(以分钟为单位)将添加到此时间值,然后使用 CONVERT 函数转换回字符串格式 hh:mm,并从字符串中删除冒号以恢复为原始格式。
单击此处查看 SQL Fiddle 中的演示。
脚本:
CREATE TABLE timevalues
(
timestring VARCHAR(20) NOT NULL
, duration INT NOT NULL
);
INSERT INTO timevalues (timestring, duration) VALUES
('1145', 30),
('2345', 25),
('0815', 125);
SELECT timestring
, duration
, REPLACE(CONVERT(VARCHAR(5), DATEVALUE, 108), ':', '') AS newtimevalue
FROM
(
SELECT timestring
, duration
, DATEADD(MINUTE,
duration,
CAST(
( SUBSTRING(timestring, 1, 2) + ':' +
SUBSTRING(timestring, 3, 2)
) AS DATETIME
)
) AS DATEVALUE
FROM timevalues
) T1;
输出:
timestring duration newtimevalue
---------- -------- -------------
1145 30 1215
2345 25 0010
0815 125 1020
它真的很丑,但给你你想要的结果:
create table #temp
(
militarytime varchar(4),
duration int
)
insert into #temp values('1410', 10)
insert into #temp values('0415', 5)
insert into #temp values('1145', 45)
insert into #temp values('0915', 30)
select left(replace(convert(varchar, dateadd(mi, duration, convert(datetime, convert(datetime, replace(militarytime, right(militarytime,2), ':' + right(militarytime,2))))), 114), ':', ''), 4)
from #temp
drop table #temp
Results:
1420
0420
1230
0945
警告 - 很可能有更好的方法 - 只是显示另一个选项。
为什么你需要以这种方式做到这一点。
就个人而言,我会保留数据类型在SQL服务器中产生自然行为。 我会在客户端或数据库层之外的任何地方处理格式设置。 使演示注意事项远离数据考虑因素;)
也就是说,我觉得我已经尽了我的职责,让宇宙变得更美好,所以我现在可以用你真正想要从我们这里得到的东西重新污染它!
REPLACE(
CONVERT(
VARCHAR(5),
DATEADD(
MINUTE,
[duration],
CAST(LEFT([time], 2) + ':' + RIGHT([time], 2) AS DATETIME)
),
8
),
':',
''
)
Select left(New_Time,2)+RIGHT(New_Time,2)
from (
Select
LEFT(
cast(CONVERT ( time ,
dateadd(minute, duration, --Dateadd will add the minutes to the time given.
Cast(LEFT(mil_time,2)+':'+Right(mil_time,2) as time) --This transforms the varchar into a Time format SQL recognizes.
),
8) as varchar),5)
as New_Time
from (
select '2145' as mil_time, 200 as duration --This is the original data.
) Orig_tbl
) Time_Format