4

一緒に追加する必要があるテーブルに 2 つの列があります。そのうちの 1 つは、ミリタリー タイムからコロンを除いた varchar(4) で、先行する 0 を含みます。もう 1 つは、予定の期間を分単位で表す int です。基本的に、2 つを一緒に追加し、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

警告 - おそらくもっと良い方法があります - 別のオプションを示すだけです。

于 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 に答える