Проблем:
Имате две колони от типа 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) КАТО минути, секунди_част като секунди