Как сравнить две даты, чтобы найти разницу во времени в SQL Server 2005, манипулирование датами - PullRequest
71 голосов
/ 01 марта 2012

У меня есть два столбца:

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

Как можно было бы использовать T-SQL для определения приблизительного количества времени, которое прошло между началом работы и ее завершением?

Я пробовал это:

select    (job_end - job_start) from tableA

но в итоге получилось:

1900-01-01 01:14:37.367

Ответы [ 11 ]

121 голосов
/ 01 марта 2012

Взгляните на функцию DateDiff().

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

Вы можете увидеть ее в действии / играть с ней здесь

19 голосов
/ 01 марта 2012

Вы можете использовать функцию DATEDIFF , чтобы получить разницу в минутах, секундах, днях и т. Д.

SELECT DATEDIFF(MINUTE,job_start,job_end)

MINUTE, очевидно, возвращает разницу в минутах, вы также можете использовать DAY, HOUR, SECOND, YEAR (полный список см. В онлайн-справочнике книг).

Если вы хотите получить фантазию, вы можете показать это по-другому, например, 75 минут могут отображаться так: 01: 15: 00: 0

Вот код для этого как для SQL Server 2005, так и для 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)
12 голосов
/ 29 августа 2013

Приведите результат как TIME, и результат будет в формате времени для продолжительности интервала.

select CAST(job_end - job_start) AS TIME(0)) from tableA
5 голосов
/ 07 октября 2015

Я думаю, вам нужен промежуток времени между job_start & job_end .

Попробуйте это ...

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

Я закончил с этим.

01:14:37
2 голосов
/ 16 июня 2016

Объявите дату начала и окончания 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())

- Получить результат в формате ЧЧ: MI: SS: MMM (24H) SELECT CONVERT(VARCHAR(12), DATEADD(MS, DATEDIFF(MS, @START_DATE, @END_DATE), 0), 114) AS TimeDiff

0 голосов
/ 03 августа 2018

Если вы пытаетесь получить рабочие часы с некоторой точностью, попробуйте это (протестировано в SQL Server 2016)

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

Различные функции DATEDIFF:

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');

Ссылка: https://docs.microsoft.com/en-us/sql/t-sql/functions/datediff-transact-sql?view=sql-server-2017

0 голосов
/ 12 февраля 2018

Я использовал следующую логику, и она работала для меня как чудо:

CONVERT(TIME, DATEADD(MINUTE, DATEDIFF(MINUTE, AP.Time_IN, AP.Time_OUT), 0)) 
0 голосов
/ 04 декабря 2017

Ниже приведен код в формате чч: мм.

выберите ПРАВО (ВЛЕВО (job_end- job_start, 17), 5)

0 голосов
/ 14 декабря 2014

Попробуйте в 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 голосов
/ 17 июля 2014

Если ваша база данных StartTime = 07:00:00 и endtime = 14:00:00, и оба типа времени. Ваш запрос для получения разницы во времени будет:

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

Если ваша база данных startDate = 2014-07-20 07:00:00 и endtime = 2014-07-20 23:00:00, вы также можете использовать этот запрос.

...