[ad_1]
165:56,258:65,258:50 のようなタイムスパン値が SQL サーバーに保存されています。
683:51 のような値の合計が必要です
私が試したこと:
SQL
WITH CTE_SUM AS ( SELECT SUM( LEFT([tot.time], 2) * 3600 + SUBSTRING([tot.time], 4, 2) * 60 ) AS SUM_AS_SECONDS FROM [dbo].[production dt] WHERE [ordernumber] = '800000025277' AND setup = 'I' AND machine IN('HMC-01', 'HMC-02') ) SELECT isnull( CAST(SUM_AS_SECONDS / 3600 AS VARCHAR) + ':' + CAST(SUM_AS_SECONDS % 3600 / 60 AS VARCHAR), '00:00' ) FROM CTE_SUM
解決策 1
最も明白な解決策は単純です。数値を文字列として保存しないでください。数値を「適切な」数値に変換してください。 たとえば、差が通常分と秒で測定される場合、タイムスパンを秒に変換し、それを INT フィールドに格納します。
そうすれば、SQL 文字列の処理がせいぜい貧弱であるため、大規模な DB では信じられないほど遅くなる文字列の切り刻みや変換を気にすることなく、直接計算を行うことができます。 また、格納された値が破損する可能性がなく、常に有効であることを意味します。
サンプリングする間隔がわかりません。分と秒、または時間と分ではなく、「標準数値」に合わせてフォーマットされていないため、DBに既に無効な値が含まれている可能性があります!
解決策 2
タイムスパンを文字列として保存することは、常に悪い考えです。 理想的には、合計分数などの数値として保存する必要があります。
文字列を使用する場合は、適切に使用する必要があります。 あなたの最初の価値は 165:56
、したがって、最初を取ることは明らかです 2 時間数としての文字は機能しません。
のインデックスを見つける必要があります :
その上で文字列を分割します。
SQL
WITH cteTimes As ( SELECT SUM( CAST(LEFT([tot.time], CHARINDEX(':', [tot.time]) - 1) As int) * 3600 + CAST(SUBSTRING([tot.time], CHARINDEX(':', [tot.time]) + 1, LEN([tot.time])) As int) * 60 ) As TotalTimeInSeconds FROM dbo.[production dt] WHERE ordernumber = '800000025277' AND setup = 'I' AND maching In ('HMC-01', 'HMC-02') ) SELECT CAST(TotalTimeInSeconds / 3600 As varchar(20)) + ':' + CAST((TotalTimeInSeconds % 3600) / 60 As varchar(20)) FROM cteTimes ;
注意: 「tot.time」、「production dt」などの「特殊な」文字を含むテーブルと列の名前を指定したため、クエリでそれらを角括弧で囲む必要があります。 これは避け、名前には標準文字 (AZ、az、0-9、_) のみを使用してください。
[ad_2]
コメント