【解決方法】これらの値の合計が必要です


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、_) のみを使用してください。

コメント

タイトルとURLをコピーしました