sql >> データベース >  >> RDS >> Sqlserver

SQL Server 2008でhh:mm:ss形式で24時間を超える値を返す

    ところで、あなたが使用しているデータ型だけでなく、procにも非常に多くの技術的な欠陥があります。本当の問題はここにあります。

    1. プロシージャでは、最初のCTE自体に日付条件を配置できます。
    2. 可能であれば、extrahoursを秒単位でテーブルに格納できます。つまり、Extrahoursはintまたはbigintです。-1000や1000.varcharのように、問題を解決することはできません。これにより、多くの変換からすばやく節約できます。
    3. group byで非常に多くの列を使用すること自体が間違ったアプローチです。特に、group byでvarchar列を使用します。groupbyでキー列を使用してから、テーブルと再度結合して、結果セットで他の列を取得する必要があります。

    サンプルデータを使用して、-31:50:46ではなく-29:-51:-30.0を取得しています。この方法で実行してください。

    DECLARE @t TABLE (ExtraHrs VARCHAR(20))
    
    INSERT INTO @t
    VALUES ('00:59:38')
        ,('-03:59:37')
        ,('-08:59:39')
        ,('-08:52:36')
        ,('-08:59:16');
    
    WITH cte
    AS (
        SELECT ExtraHrs
            ,CASE 
                WHEN left(ExtraHrs, 1) = '-'
                    THEN - 1
                ELSE 1
                END AS multiply
            ,right(ExtraHrs, 8) AS timestring
            ,
            --get hours in seconds:
            DATEPART(HOUR, right(ExtraHrs, 8)) * 3600 AS h_in_s
            ,
            --get minutes in seconds:
            DATEPART(MINUTE, right(ExtraHrs, 8)) * 60 AS m_in_s
            ,
            --get seconds:
            DATEPART(SECOND, right(ExtraHrs, 8)) AS s
        FROM @t
        )
        ,CTE3
    AS (
        SELECT *
            ,c.h_in_s + c.m_in_s + c.s AddExtra
        FROM cte c
        )
        ,cte4
    AS (
        SELECT sum(AddExtra * multiply) mn
        FROM cte3
        )
        ,cte5
    AS (
        SELECT mn / 3600 hh
            ,(mn % 3600) / 60 mi
            ,(mn % 3600.0) % 60 ss
        FROM cte4
        )
    SELECT CASE 
            WHEN hh < 0
                THEN '-'
            ELSE ''
            END
        ,cast(hh AS VARCHAR) + ':' + cast(mi AS VARCHAR) + ':' + cast(ss AS VARCHAR)
    FROM cte5
    


    1. 表の値の連続発生数をカウントします

    2. エラーメッセージ:スレッドメインorg.hibernate.HibernateExceptionの例外:staxストリームへのアクセス中にエラーが発生しました

    3. MySQLでのMyISAMの操作

    4. Glassfishでアイドルタイムアウトした後、データベース接続が解放されない