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

4
我需要将表中的两列相加。其中一列为military time格式(不包含冒号,前导零),数据类型为varchar(4);另一列为预约时长,单位为分钟,数据类型为int。我需要将这两列相加,并保留varchar(4)格式,与第一列保持一致。我之前使用过SQL,但并不精通。请问应该如何处理?谢谢! 注意:无需考虑时间跨天的情况。 例如:
time:       '1145'
duration:   45
sum:        '1230'

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

你可以发布一些示例数据,然后列出你期望的结果吗? - Taryn
4个回答

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

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

注意 - 很可能有更好的方法 - 只是展示另一种选择。


没有一个例子特别漂亮 :) 对它们没有任何偏见,只是存储格式化字符串通常需要一些冗长的代码(不幸的是)。 - Leigh

2

我不知道为什么你需要以这种方式做这个。

个人而言,我会让数据类型保持在SQL-Server中自然的行为。格式化处理应该在客户端或数据库层之外的任何地方进行。将呈现考虑与数据考虑分开;)

话虽如此,我觉得我已经尽了自己的职责,使宇宙变得更好,所以现在可以告诉我们你实际想要我们做什么了!

REPLACE(
  CONVERT(
    VARCHAR(5),
    DATEADD(
      MINUTE,
      [duration],
      CAST(LEFT([time], 2) + ':' + RIGHT([time], 2) AS DATETIME)
    ),
    8
  ),
  ':',
  ''
)

基本上,我需要在 SQL 查询的函数调用参数的上下文中使用它,以避免不同性质的问题。 - Panzercrisis

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

不像下面一些答案那么漂亮,但非常实用。 - David Manheim
2
仅供参考:假设使用SQL Server 2008+(由于TIME数据类型) - MatBailie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,