我在表格中有两列需要加在一起。其中一个是具有军事时间的varchar(4),减去冒号,包括前面的0。另一个是一个int,以分钟为单位描述约会的持续时间。基本上我需要将两者一起添加并保存为varchar(4),所有格式都与第一列相同。我之前使用过SQL,但不是以任何复杂的方式。什么是正确的方法?谢谢!
我不必担心第二天的事情。
例如:
time: '1145'
duration: 45
sum: '1230'
time: '0915'
duration: 30
sum: '0945' (not '945')
答案 0 :(得分:4)
假设是问题表明时间总是以4位数格式hhmm。查询从字符串中提取hh和mm并转换为时间。以分钟为单位的持续时间将添加到此时间值,然后使用CONVERT函数转换回字符串格式hh:mm,并从字符串中删除冒号以恢复原始格式。
Click here to view the demo in 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
答案 1 :(得分:2)
它非常丑陋但却能给你你想要的结果:
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
CAVEAT - 最有可能是更好的方式 - 只是展示另一种选择。
答案 2 :(得分:2)
我不知道为什么你需要这样做。
就个人而言,我会将数据类型保留为SQL-Server中产生自然行为的内容。我将处理客户端或数据库层之外的任何位置的格式。将演示文稿考虑因素远离数据注意事项;)
那就是说,我觉得我已经尽了自己的责任让宇宙变得更美好,所以我现在可以用你真正想要的东西来重新污染它!
REPLACE(
CONVERT(
VARCHAR(5),
DATEADD(
MINUTE,
[duration],
CAST(LEFT([time], 2) + ':' + RIGHT([time], 2) AS DATETIME)
),
8
),
':',
''
)
答案 3 :(得分:1)
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