4

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

我不必担心东西会延续到第二天。

例如:

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

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

4 回答 4

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
于 2012-05-01T16:16:11.753 回答
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 - 很可能有更好的方法 - 只是显示另一种选择。

于 2012-05-01T16:17:50.183 回答
2

我不知道为什么您需要以这种方式执行此操作。

就个人而言,我会保留数据类型以在 SQL-Server 中产生自然行为。我会在客户端或数据库层之外的任何地方处理格式。让演示文稿考虑远离数据考虑;)

也就是说,我觉得我已经尽了责任让宇宙变得更美好,所以我现在可以用你真正想要的东西重新污染它!

REPLACE(
  CONVERT(
    VARCHAR(5),
    DATEADD(
      MINUTE,
      [duration],
      CAST(LEFT([time], 2) + ':' + RIGHT([time], 2) AS DATETIME)
    ),
    8
  ),
  ':',
  ''
)
于 2012-05-01T16:20:58.533 回答
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
于 2012-05-01T16:24:04.943 回答