Проблем:
Имате две колони от типа времеви печат и искате да изчислите разликата между тях.
Пример:
В 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 (разлика в дни, часове, минути или секунди):
ИЗБЕРЕТЕ идентификатор, заминаване, пристигане, TIMESTAMPDIFF(SECOND, заминаване, пристигане) КАТО разликаFROM пътуване;
Резултатът е:
| 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 |
Дискусия:
За да изчислите разликата между клеймите за време в MySQL, използвайте TIMESTAMPDIFF(unit, start, end) функция. Аргументът за единица може да бъде MICROSECOND , SECOND , MINUTE , HOUR , DAY , WEEK , MONTH , QUARTER , или YEAR . За да получите разликата в секунди, както направихме тук, изберете SECOND . За да получите разликата в минути, изберете MINUTE; за разликата в часовете изберете HOUR , и т.н. Аргументите за край и начало са съответно крайната дата и началната дата (тук departure и arrival , respectively ).
Решение 2 (разлика в дни, часове, минути и секунди):
С разлика_в_секунди AS ( ИЗБЕРЕТЕ идентификатор, заминаване, пристигане, TIMESTAMPDIFF(SECOND, заминаване, пристигане) КАТО секунди ОТ пътуване), разлики AS ( ИЗБЕРЕТЕ идентификатор, заминаване, пристигане, секунди, MOD(секунди, 60) КАТО секунди_част, MOD (секунди, 3600) AS минути_част, MOD(секунди, 3600 * 24) AS hours_part ОТ разлика_в_секунди)ИЗБЕРЕТЕ идентификатор, заминаване, пристигане, CONCAT( FLOOR(секунди / 3600 / 24), 'дни', FLOOR(часа_част), / 360 'часове', FLOOR(minutes_part / 60), 'minutes', seconds_part, ' seconds' ) КАТО РАЗЛИКА ОТ разликите;
Резултатът е:
| 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 секунди |
Дискусия:
Първо изчислете разликата между клеймите за време в секунди, като използвате TIMESTAMPDIFF() функция (първият CTE, наречен difference_in_seconds ), точно както в Решение 1. Изчислете колко секунди има над цели минути (seconds_part ) да се използва по-късно за изчисляване на секундите, колко секунди има над цели часове (minutes_part ), който да се използва по-късно за изчисляване на минутите и колко секунди има над цели часове (hours_part ), за да се използва по-късно за изчисляване на часовете.
За да направите това, използвайте MOD() функция. Например един час има 3600 секунди, така че за да намерите колко секунди има в minutes_part , намерете остатъка от деленето на 3600 по следния начин:
MOD(seconds, 3600) AS minutes_part
По същия начин има 3600 * 24 секунди на ден, за да изчислите колко секунди има в hours_part , напишете:
MOD(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), ' минути ', секунди_част, ' секунди ) КАТО разликапредварително>Представеното тук решение връща последната колона като текст. Можете лесно да модифицирате това решение, за да го покажете в друг формат. Можете също да покажете числата в отделни колони, както следва:
FLOOR(секунди / 3600 / 24) КАТО дни, FLOOR(часа_част / 3600) КАТО часове, FLOOR(минути_част / 60) КАТО минути, секунди_част като секунди