So vergleichen Sie zwei Daten, um den Zeitunterschied in SQL Server 2005 zu ermitteln, Datumsmanipulation


73

Ich habe zwei Spalten:

job_start                         job_end
2011-11-02 12:20:37.247           2011-11-02 13:35:14.613

Wie wäre es möglich, mithilfe von T-SQL die ungefähre Zeit zu ermitteln, die zwischen dem Start des Jobs und dem Ende des Jobs vergangen ist?

Ich habe es versucht:

select    (job_end - job_start) from tableA

aber am Ende mit diesem:

1900-01-01 01:14:37.367

Wie Sie sehen können, ist das Ergebnis der DateTimeSubtraktion ein anderes Datum, das 1900.01.01 plus der resultierenden Differenz entspricht, die in Ihrem Fall 1: 14: 37.367 beträgt .
— Ant_222

Antworten:


125

Schauen Sie sich die DateDiff()Funktion an.

-- Syntax
-- DATEDIFF ( datepart , startdate , enddate )

-- Example usage
SELECT DATEDIFF(DAY, GETDATE(), GETDATE() + 1) AS DayDiff
SELECT DATEDIFF(MINUTE, GETDATE(), GETDATE() + 1) AS MinuteDiff
SELECT DATEDIFF(SECOND, GETDATE(), GETDATE() + 1) AS SecondDiff
SELECT DATEDIFF(WEEK, GETDATE(), GETDATE() + 1) AS WeekDiff
SELECT DATEDIFF(HOUR, GETDATE(), GETDATE() + 1) AS HourDiff
...

Sie können es hier in Aktion sehen / damit spielen


19

Mit der DATEDIFF- Funktion können Sie die Differenz in Minuten, Sekunden, Tagen usw. ermitteln.

SELECT DATEDIFF(MINUTE,job_start,job_end)

MINUTE gibt natürlich die Differenz in Minuten zurück. Sie können auch DAY, HOUR, SECOND, YEAR verwenden (die vollständige Liste finden Sie im Online-Link der Bücher).

Wenn Sie Lust haben, können Sie dies anders anzeigen, zum Beispiel könnten 75 Minuten wie folgt angezeigt werden: 01: 15: 00: 0

Hier ist der Code dafür für SQL Server 2005 und 2008

-- SQL Server 2005
SELECT CONVERT(VARCHAR(10),DATEADD(MINUTE,DATEDIFF(MINUTE,job_start,job_end),'2011-01-01 00:00:00.000'),114)

-- SQL Server 2008
SELECT CAST(DATEADD(MINUTE,DATEDIFF(MINUTE,job_start,job_end),'2011-01-01 00:00:00.000') AS TIME)

1
@ JamesHill Danke James, du hörst dich an, als ob du Urlaub brauchst! Also habe ich Ihre Antwort positiv bewertet.
— some_bloody_fool

@some_bloody_fool, (: danke. Sie haben wahrscheinlich tatsächlich Recht!
— James Hill

Ok, ich habe eine weitere Möglichkeit hinzugefügt, die Sie jetzt anzeigen können, wenn Sie dies wünschen.
— Vince Pergolizzi

12

Wirf das Ergebnis als TIMEund das Ergebnis wird für die Dauer des Intervalls im Zeitformat sein.

select CAST(job_end - job_start) AS TIME(0)) from tableA

2
Wunderbar, das ist es, wonach ich genau suche. Danke!
— Hakuna

5

Ich denke, Sie brauchen die Zeitlücke zwischen job_start & job_end .

Versuche dies...

select SUBSTRING(CONVERT(VARCHAR(20),(job_end - job_start),120),12,8) from tableA

Ich bin damit gelandet.

01:14:37

2

Geben Sie das Start- und Enddatum an DECLARE @SDATE AS DATETIME

TART_DATE  AS DATETIME
DECLARE @END_-- Set Start and End date
SET @START_DATE = GETDATE()
SET @END_DATE    = DATEADD(SECOND, 3910, GETDATE())

- Holen Sie sich das Ergebnis im Format HH: MI: SS: MMM (24H) SELECT CONVERT(VARCHAR(12), DATEADD(MS, DATEDIFF(MS, @START_DATE, @END_DATE), 0), 114) AS TimeDiff


0

Versuchen Sie dies in SQL Server

SELECT 
      start_date as firstdate,end_date as seconddate
       ,cast(datediff(MI,start_date,end_date)as decimal(10,3)) as minutediff
      ,cast(cast(cast(datediff(MI,start_date,end_date)as decimal(10,3)) / (24*60) as int ) as varchar(10)) + ' ' + 'Days' + ' ' 
      + cast(cast((cast(datediff(MI,start_date,end_date)as decimal(10,3)) / (24*60) - 
        floor(cast(datediff(MI,start_date,end_date)as decimal(10,3)) / (24*60)) ) * 24 as int) as varchar(10)) + ':' 

     + cast( cast(((cast(datediff(MI,start_date,end_date)as decimal(10,3)) / (24*60) 
      - floor(cast(datediff(MI,start_date,end_date)as decimal(10,3)) / (24*60)))*24
        -
        cast(floor((cast(datediff(MI,start_date,end_date)as decimal(10,3)) / (24*60) 
      - floor(cast(datediff(MI,start_date,end_date)as decimal(10,3)) / (24*60)))*24) as decimal)) * 60 as int) as varchar(10))

    FROM [AdventureWorks2012].dbo.learndate

0

Wenn Ihre Datenbank StartTime = 07:00:00und Endzeit = 14:00:00und beide vom Zeittyp sind. Ihre Anfrage, um den Zeitunterschied zu erhalten, wäre:

SELECT TIMEDIFF(Time(endtime ), Time(StartTime )) from tbl_name

Wenn Ihre Datenbank startDate = 2014-07-20 07:00:00und endtime = ist 2014-07-20 23:00:00, können Sie diese Abfrage auch verwenden.


Welche Version von SQL Server unterstützt die TIMEDIFFFunktion?
— Alex

0

Der folgende Code gibt im Format hh: mm an.

Wählen Sie RECHTS (LINKS (job_end- job_start, 17), 5).


1
Ich denke, das ist nicht genau das, was das OP verlangt. Die Verwendung von DATE_DIFF sollte helfen ...
— Tyron78

0

Schauen Sie sich DATEDIFF an , das sollte genau das sein, wonach Sie suchen. Es werden die beiden Daten verwendet, die Sie vergleichen, und die Datumseinheit, in der Sie die Differenz wünschen (Tage, Monate, Sekunden ...).


0

Ich habe folgende Logik verwendet und es hat bei mir wie ein Wunder funktioniert:

CONVERT(TIME, DATEADD(MINUTE, DATEDIFF(MINUTE, AP.Time_IN, AP.Time_OUT), 0)) 

0

Wenn Sie versuchen, mit einer gewissen Genauigkeit Arbeitsstunden zu erhalten, versuchen Sie dies (getestet in SQL Server 2016).

SELECT DATEDIFF(MINUTE,job_start, job_end)/60.00;

Verschiedene DATEDIFF-Funktionen sind:

SELECT DATEDIFF(year,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(quarter,     '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(month,       '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(dayofyear,   '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(day,         '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(week,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(hour,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(minute,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(second,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(millisecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');

Ref: https://docs.microsoft.com/en-us/sql/t-sql/functions/datediff-transact-sql?view=sql-server-2017

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.