Проблем:
Имате две колони от типа datetime
и искате да изчислите разликата между тях.
Пример:
В travel
таблица, има три колони:id
, departure
и arrival
. Искате да изчислите разликата между arrival
и departure
.
travel
таблицата изглежда така:
id | отпътуване | пристигане |
---|---|---|
1 | 2018-03-25 12:00:00 | 2018-04-05 07:30:00 |
2 | 2019-09-12 15:50:00 | 23.10.2019 10:30:30 |
3 | 2018-07-14 16:15:00 | 2018-07-14 20:40:30 |
4 | 2018-01-05 08:35:00 | 2019-01-08 14:00:00 |
Решение 1 (разлика в секунди):
ИЗБЕРЕТЕ идентификатор, заминаване, пристигане, DATEDIFF(втора, заминаване, пристигане) КАТО разлика ОТ пътуване;
Резултатът е:
id | отпътуване | пристигане | разлика |
---|---|---|---|
1 | 2018-03-25 12:00:00 | 2018-04-05 07:30:00 | 934200 |
2 | 2019-09-12 15:50:00 | 23.10.2019 10:30:30 | 3523230 |
3 | 2018-07-14 16:15:00 | 2018-07-14 20:40:30 | 15930 |
4 | 2018-01-05 08:35:00 | 2019-01-08 14:00:00 | 31814700 |
Дискусия:
За изчисляване на разликата между arrival
и заминаването в T-SQL, използвайте DATEDIFF(datepart, startdate, enddate)
функция. datepart
аргументът може да бъде microsecond
, second
, minute
, hour
, day
, week
, month
, quarter
или year
. Тук бихте искали да получите разликата в секунди, така че изберете второто. За да получите разликата в часовете, изберете hour
; за разликата в месеците изберете month
, и т.н. startdate
и enddate
Аргументите са началният и крайният datetime
колони, съответно (тук departure
и arrival
, съответно).
Решение 2 (разлика в дни, часове, минути и секунди):
С разлика_в_секунди AS ( ИЗБЕРЕТЕ идентификатор, заминаване, пристигане, DATEDIFF(SECOND, заминаване, пристигане) КАТО секунди ОТ пътуване), разлики AS ( ИЗБЕРЕТЕ идентификатор, заминаване, пристигане, секунди, секунди % 60 AS секунди_част, секунди % 3600 AS минути_част, секунди % (3600 * 24) КАТО часове_част ОТ разлика_в_секунди)ИЗБЕРЕТЕ идентификатор, заминаване, пристигане, CONCAT( FLOOR(секунди / 3600 / 24), ' дни ', FLOOR(часове_част / 3600), 'часове ', FLOOR_part(минути / 60), ' минути ', секунди_част, ' секунди ) КАТО разлика ОТ разлики;
Резултатът е:
id | отпътуване | пристигане | разлика |
---|---|---|---|
1 | 2018-03-25 12:00:00 | 2018-04-05 07:30:00 | 10 дни 19 часа 30 минути 0 секунди |
2 | 2019-09-12 15:50:00 | 23.10.2019 10:30:30 | 40 дни 18 часа 40 минути 30 секунди |
3 | 2018-07-14 16:15:00 | 2018-07-14 20:40:30 | 0 дни 4 часа 25 минути 30 секунди |
4 | 2018-01-05 08:35:00 | 2019-01-08 14:00:00 | 368 дни 5 часа 25 минути 0 секунди |
Дискусия:
Първо, изчислете разликата между arrival
и departure
за секунди, като използвате DATEDIFF()
функция (първият CTE, наречен difference_in_seconds
), точно както в Решение 1. След това изчислете колко секунди има над цели минути (seconds_part
) да се използва по-късно за изчисляване на секундите, колко секунди има над цели часове (minutes_part
), който да се използва по-късно за изчисляване на минутите и колко секунди има над цели часове (hours_part
), за да се използва по-късно за изчисляване на часовете.
За да направите това, използвайте оператора %. Например един час има 3600 секунди, така че за да намерите колко секунди има в minutes_part
, намерете остатъка от деленето на 3600 по следния начин:
seconds % 3600 AS minutes_part
По същия начин има 3600 * 24
секунди на ден, за да изчислите колко секунди има в hours_part
, напишете:
seconds % (3600 * 24) AS hours_part
След като тези остатъци бъдат изчислени (във втория CTE, наречен differences
), най-накрая можете да получите разликата в дни, часове, минути и секунди. За да получите броя на секундите, минутите, часовете и дните, разделете броя на секундите в остатъка на съответния брой секунди в дни, часове или минути. Например, за да разберете колко минути трябва да се показват, вземете minutes_part
и го разделете на 60, тъй като в един час има 60 минути. Нуждаете се само от цялата част от това (т.е. без десетичната част), така че използвайте FLOOR()
функционира така:
FLOOR(minutes_part / 60)
И накрая, просто трябва да покажете в един низ това, което сте изчислили. За да направите това, използвайте CONCAT()
функция във външната заявка:
CONCAT( FLOOR(секунди / 3600 / 24), ' дни ', FLOOR (часове_част / 3600), ' часове ', FLOOR(minutes_part / 60), ' минути ', секунди_част, ' секунди ) КАТО разликапредварително>Представеното тук решение връща
datetime
разлика като текст. Можете лесно да промените решението, за да получите само числата без никакъв текст. Можете също да съхранявате дни, часове, минути и секунди в различни колони:FLOOR(секунди / 3600 / 24) КАТО дни, FLOOR(часа_част / 3600) КАТО часове, FLOOR(минути_част / 60) КАТО минути, секунди_част като секунди