Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да изчислим разликата между две времеви марки в MySQL

Проблем:

Имате две колони от типа времеви печат и искате да изчислите разликата между тях.

Пример:

В 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) КАТО минути, секунди_част като секунди

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използвайте mysqldump за архивиране на MySQL или MariaDB

  2. странно кодиране на символи на съхранените данни, старият скрипт им показва добре, новият не го прави

  3. Как да деинсталирате MySQL от Mac OS X?

  4. Грешка в MySQL:'Отказан достъп за потребител 'root'@'localhost'

  5. 1064 грешка в CREATE TABLE ... TYPE=MYISAM