如何将持续时间添加到格式为hhmm的字符串并将其转换回字符串?

时间:2012-05-01 16:01:52

标签: sql sql-server casting int varchar

我在表格中有两列需要加在一起。其中一个是具有军事时间的varchar(4),减去冒号,包括前面的0。另一个是一个int,以分钟为单位描述约会的持续时间。基本上我需要将两者一起添加并保存为varchar(4),所有格式都与第一列相同。我之前使用过SQL,但不是以任何复杂的方式。什么是正确的方法?谢谢!

我不必担心第二天的事情。

例如:

time:       '1145'
duration:   45
sum:        '1230'

time:       '0915'
duration:   30
sum:        '0945' (not '945')

4 个答案:

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