別のオプション望ましい結果を得るためにsubstring
とpatindex
と共通テーブル式のカップルを使用することです。
まず、サンプルテーブルを作成してデータを入力します。(Please
DECLARE @T AS TABLE
(
Duration varchar(40),
NumberOfSeconds int
)
INSERT INTO @T (Duration) VALUES
('39 Seconds'),
('2 Minutes 4 Seconds'),
('1 Hours 7 Minutes 17 Seconds'),
('3 Days 9 Hour 8 Minutes 25 Seconds')
はその後、各単語のpatindex
結果を保持するために1つのCTEを使用します)私達にあなたの将来の質問では、このステップを保存します。
これは、patindex
を何度も繰り返し書き込む必要がないためです。更新、今
;WITH cte1 as
(
SELECT *,
PATINDEX('%Day%', Duration) As DaysIndex,
PATINDEX('%Hour%', Duration) As HoursIndex,
PATINDEX('%Minute%', Duration) As MinutesIndex,
PATINDEX('%Second%', Duration) As SecondIndex
FROM @T
), cte2 as
(
SELECT *,
CASE WHEN DaysIndex > 0 THEN
CAST(SUBSTRING(Duration, 0, DaysIndex) As int) * 60 * 60 * 24
ELSE
0
END As D,
CASE WHEN HoursIndex > 0 THEN
CAST(
SUBSTRING(Duration,
CASE WHEN DaysIndex > 0 THEN DaysIndex + 4
ELSE 0
END,
CASE WHEN DaysIndex > 0 THEN HoursIndex - DaysIndex - 4
ELSE HoursIndex
END
) As int) * 60 * 60
ELSE
0
END As H,
CASE WHEN MinutesIndex > 0 THEN
CAST(
SUBSTRING(Duration,
CASE WHEN HoursIndex > 0 THEN HoursIndex + 5
ELSE 0
END,
CASE WHEN HoursIndex > 0 THEN MinutesIndex - HoursIndex - 5
ELSE MinutesIndex
END
) As int) * 60
ELSE
0
END As M,
CASE WHEN SecondIndex > 0 THEN
CAST(
SUBSTRING(Duration,
CASE WHEN MinutesIndex > 0 THEN MinutesIndex + 7
ELSE 0
END,
CASE WHEN MinutesIndex > 0 THEN SecondIndex - MinutesIndex - 7
ELSE SecondIndex
END
) As int)
ELSE
0
END As S
FROM cte1
)
NumberOfSeconds
カラム:
UPDATE cte2
SET NumberOfSeconds = D + H + M + S
が更新を確認する 最初のCTEを使用して、各時間部分の値を抽出するsubstring
を使用するこれに別のCTEを追加結果:
SELECT *
FROM @T
結果:
Duration NumberOfSeconds
---------------------------------------- ---------------
39 Seconds 39
2 Minutes 4 Seconds 124
1 Hours 7 Minutes 17 Seconds 4037
3 Days 9 Hour 8 Minutes 25 Seconds 292105
文字列関数を使用して必要なものを実現することは可能です。しかし、なぜあなたはそれを避けることができるときにそのような痛みに苦しむ? 'nvarchar'ではなくtimestampsとしてタイムスタンプを保存します。 –
@TimBiegeleisen - 私はあなたに同意しますが、私はこのDBの管理者ではなく、厳密にデータの消費者です。 – Zachafer
わずか2分であればどうなりますか? 0日0時間2分かかりますか? – scsimon