0

私が与えられたタスクの一部には、いくつかの列で計算を実行することが含まれます。そのうちの 2 つは hh.mi.ss 形式で、それらは varchar です。計算を機能させるには、時間の 10 進形式にする必要があります。これにより、1:30 は 1.5 になります。現在 SQL Server 2005 を使用しているため、時間やデータ型が組み込まれておらず、アップグレードされたバージョンを取得できません (私の選択ではありません)。私が持っているものを使って、オンラインで検索して変換しようとしましたが、結果は正確ではありません。たとえば、13.28 は (大まかに) 13.5 になりますが、秒は 60 で終わるのではなく 100 になります (フロートに変換しているため)。

たとえば、12.57.46 を使用すると、

CAST(DATEPART(HH, CAST(REPLACE([OASTIM], '.', ':') AS DATETIME)) AS FLOAT) + 
(CAST(DATEPART(MI, CAST(REPLACE([OASTIM], '.', ':') AS DATETIME)) AS FLOAT)/60) + 
(CAST(DATEPART(SS, CAST(REPLACE([OASTIM], '.', ':') AS DATETIME)) AS FLOAT)/3600)

私に12.962をくれました...

一方

CAST(SUBSTRING([OASTIM], 1, 2) AS FLOAT) +
((CAST(SUBSTRING([OASTIM], 4, 5) AS FLOAT) + 
CAST(SUBSTRING([OASTIM], 7, 8) AS FLOAT)/60)/60)

私に12.970をくれました....

そして、もっと簡単なことを試したとき、

DATEPART(HOUR, CAST(REPLACE([OASTIM], '.', ':') AS DATETIME))+
(DATEPART(MINUTE, CAST(REPLACE([OASTIM], '.', ':') AS DATETIME))/60)

フロップアウトして、12しかくれなかった

Windows SQL と T-SQL に初めて触れたので、数時間苦労しました。恐ろしく聞こえるかもしれませんが、パフォーマンスが犠牲になることを意味しても、私はそれが機能することに満足するところまで来ています。

4

3 に答える 3

0

時間を DecimalHours に変換する簡単な方法を次に示します。

SELECT cast(cast('12.57:46' as datetime) as float) * 24

結果:

~12.963
于 2014-03-22T19:08:39.777 に答える
0

あなたが言った、

CAST(SUBSTRING([OASTIM], 1, 2) AS FLOAT) +
((CAST(SUBSTRING([OASTIM], 4, 5) AS FLOAT) + 
CAST(SUBSTRING([OASTIM], 7, 8) AS FLOAT)/60)/60)

私に12.970をくれました....

'12.57.46' の入力に対して 12.970 は間違っています。問題は、SUBSTRING 関数を正しく使用していないことです。3 番目の引数は、終了文字位置ではなく、文字数を表します。

このコードを見てください:

@Sample varchar(20) を宣言

@サンプルを設定 = '12.57.46'

select  CAST(SUBSTRING(@Sample, 1, 2) AS FLOAT) +
        CAST(SUBSTRING(@Sample, 4, 5) AS FLOAT) / 60 + 
        CAST(SUBSTRING(@Sample, 7, 8) AS FLOAT) / 60 / 60,
        SUBSTRING(@Sample, 1, 2),
        SUBSTRING(@Sample, 4, 5),
        SUBSTRING(@Sample, 7, 8),
        CAST(SUBSTRING(@Sample, 1, 2) AS FLOAT) +
        CAST(SUBSTRING(@Sample, 4, 2) AS FLOAT) / 60 + 
        CAST(SUBSTRING(@Sample, 7, 2) AS FLOAT) / 60 / 60

5 文字を求めているため、議事録が 57.46 として表示されることに注意してください。8 文字を要求しているにもかかわらず、文字列には 2 文字しか残っていないため、その 2 文字だけが返されるため、秒は正しく表示されます。

ところで、私はこの問題をゴードンと同じ方法で解決しますが、日付を削除して次のようにします。

Select DateDiff(Second, 
                0, 
                Convert(DateTime, Replace([OASTIM], '.',':'))) / 3600.0
于 2014-03-22T21:22:08.957 に答える