Frage

In einer SQL-Datenbank, die ich einige wählt machen, die eine Dauer erhalten (als Ergebnis einer Subtraktion zwischen zwei Daten) in Sekunden als int. Aber ich mag, um dieses Ergebnis zu formatieren in einer für Menschen lesbare Form wie ‚hh: mm‘ oder ‚dd: hh‘. Ist das möglich in SQL und wie kann ich erkennen, das?

War es hilfreich?

Lösung

In SQL 2005 können Sie verwenden, um die folgenden:

    select convert(varchar(8), dateadd(second, [SecondsColumn], 0),  108)

Welche wandelt zuerst die Sekunden in ein Datum nach 1900-01-01, und dann erhält die hh: mm: ss Teil.

Wenn die Spalte mehr als 24 Stunden ist, wird dies überschlagen, wenn Sie Tage wollen und dann Stunden in diesem Fall nur so etwas wie:

case when SecondsColumn> (24*60*60) 
        then 
            cast(datepart(day,datediff(dd, 0, dateadd(second, SecondsColumn, 0))) as varchar(4))
        +   'd' + convert(varchar(2), dateadd(second, SecondsColumn, 0), 108) 
    else
            convert(varchar(8), dateadd(second, SecondsColumn, 0), 108) 
    end

Andere Tipps

Jede Datenbank macht es anders. Ich benutze PostgreSQL und es tut es etwa so:

select to_char(my_date - my_other_date, 'HH:MM:SS');

Sie finden das Handbuch für die Datenbank konsultieren müssen Sie verwenden.

Angenommen, Sie Sekunden haben:

DECLARE @DurationSeconds INT

-- 25h 45m 14s
SET @DurationSeconds = (25 * 3600) + (45 * 60) + (14)

SELECT 
  @DurationSeconds, 
  @DurationSeconds / 3600 hours, 
  @DurationSeconds % 3600 / 60 minutes,
  @DurationSeconds % (3600 / 60) seconds

Ich werde die Aufgabe der Formatierung, die gut zu dir lassen. : -)

Es gibt keinen Standard, obwohl viele DBMS-Systeme ihre eigene Syntax haben.

In der Regel ist es besser zu tun Formatierung-for-Mensch-Lesbarkeit Arbeit in Präsentationsschicht Ihrer Anwendung und nicht irgendwo in der Nähe der Datenbank.

In Oracle SQL:

   -- 86,400 seconds in a  day
   --  3,600 seconds in an hour
   --     60 seconds in a  minute
   select duration, -- seconds
    trunc((duration)/86400) || ':' || -- dd
    trunc(mod(duration,86400)/3600) || ':' || -- hh
    trunc(mod(mod(duration,86400),3600)/60) || ':' || -- mm
    mod(mod(mod(duration,86400),3600),60) -- ss
   as human_readable
   from dual
   ;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top