Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Kembalikan lebih dari 24 jam dalam format jj:mm:dd di SQL server 2008

BTW ada begitu banyak kelemahan teknis dalam proc serta tipe data yang Anda gunakan. Masalah Sebenarnya ada di sini.

  1. Dalam proc Anda, Anda dapat menempatkan kondisi tanggal di CTE pertama itu sendiri.
  2. Jika memungkinkan, Anda dapat menyimpan jam ekstra dalam hitungan detik dalam tabel. Artinya, Extrahours adalah int atau bigint.like -1000 atau 1000.varchar tidak akan menyelesaikan masalah Anda. Ini akan menyelamatkan Anda dari banyak konversi dengan cepat.
  3. Menggunakan begitu banyak kolom dalam grup dengan sendirinya merupakan pendekatan yang salah. Khususnya menggunakan kolom varchar di grup by. Anda harus menggunakan kolom kunci dalam grup kemudian bergabung lagi dengan tabel untuk mendapatkan kolom lain di hasil.

dengan data sampel Anda, saya mendapatkan -29:-51:-30.0 bukannya -31:50:46 .lakukan dengan cara ini,

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menyiapkan dan Mengonfigurasi Replikasi SQL Server

  2. Menemukan Induk Tingkat Teratas di SQL

  3. Memindahkan Tabel SQL Server ke Filegroup Berbeda

  4. Php dengan SQL Server

  5. Cara melihat log transaksi di SQL Server 2008