Jak porównać dwie daty, aby znaleźć różnicę czasu w SQL Server 2005, manipulacja datą

Mam dwie kolumny:

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

Jak byłoby możliwe użycie T-SQL, aby znaleźć nieprzetworzony czas, który upłynął między rozpoczęciem zadania a zakończeniem zadania?

Próbowałem tego:

select    (job_end - job_start) from tableA

Ale skończyło się na tym:

1900-01-01 01:14:37.367
Author: Kara, 2012-03-01

11 answers

Spójrz na DateDiff() funkcja.

-- 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
...

Możesz zobaczyć go w akcji / Zagraj z nim tutaj

 116
Author: James Hill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-29 12:53:10

Możesz użyć funkcji DATEDIFF Aby uzyskać różnicę w minutach, sekundach, dniach itp.

SELECT DATEDIFF(MINUTE,job_start,job_end)

MINUTE oczywiście zwraca różnicę w minutach, możesz również użyć dnia, godziny, sekundy, roku (pełna lista znajduje się w linku książki online).

Jeśli chcesz uzyskać fantazję możesz pokazać to inaczej na przykład 75 minut może być wyświetlany w ten sposób: 01:15:00:0

Oto kod, aby to zrobić zarówno dla SQL Server 2005 i 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)
 18
Author: Vince Pergolizzi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-01 18:27:48

Przelicz wynik jako TIME, a wynik będzie w formacie czasowym dla czasu trwania przedziału.

select CAST(job_end - job_start) AS TIME(0)) from tableA
 11
Author: Ric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-23 06:37:44

Myślę, że potrzebujesz przerwy czasowej pomiędzy job_start & job_end .

Spróbuj tego...
select SUBSTRING(CONVERT(VARCHAR(20),(job_end - job_start),120),12,8) from tableA
Skończyłem z tym.
01:14:37
 5
Author: Sahan Samaranayaka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-07 07:01:05

Jeśli twoja baza danych StartTime = 07:00:00 i endtime = 14:00:00, i oba są typem czasu. Twoje zapytanie aby uzyskać różnicę czasu będzie:

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

Jeśli twoja baza danych startDate = 2014-07-20 07:00:00 i endtime = 2014-07-20 23:00:00, Możesz również użyć tego zapytania.

 2
Author: tapos ghosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-06 22:54:10

Zadeklarować datę rozpoczęcia i zakończenia 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())

-- uzyskaj wynik w formacie HH:MI:SS:MMM(24H) SELECT CONVERT(VARCHAR(12), DATEADD(MS, DATEDIFF(MS, @START_DATE, @END_DATE), 0), 114) AS TimeDiff

 2
Author: user6474160,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-16 11:17:22

Spróbuj tego w 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
Author: Vikash Rakshit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-14 15:00:03

Poniższy kod podaje w formacie hh:mm.

Select RIGHT(LEFT (job_end - job_start,17),5)

 0
Author: Nandhakumar S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-04 07:21:01

Spójrz na DATEDIFF , to powinno być to, czego szukasz. Zajmuje dwie daty, które porównujesz, i jednostkę daty, w której chcesz uzyskać różnicę (dni, miesiące, sekundy...)

 0
Author: Sam DeHaan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-26 07:03:48

Użyłem następującej logiki i zadziałało mi jak marvel:

CONVERT(TIME, DATEADD(MINUTE, DATEDIFF(MINUTE, AP.Time_IN, AP.Time_OUT), 0)) 
 0
Author: Kasim Husaini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-12 04:50:48

Jeśli próbujesz uzyskać godziny pracy z pewną dokładnością, spróbuj tego (Przetestowane w SQL Server 2016)

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

Różne funkcje DATEDIFF to:

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

 0
Author: rchacko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-03 02:04:27