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