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
some_bloody_fool
quelle
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

James Hill
quelle
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)
Vince Pergolizzi
quelle
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
Ric
quelle
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
Sahan Samaranayaka
quelle
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

user6474160
quelle
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
Vikash Rakshit
quelle
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.

Tapos Ghosh
quelle
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).

Nandhakumar S.
quelle
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 ...).

Sam DeHaan
quelle
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)) 
Kasim Husaini
quelle
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

rchacko
quelle