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

Как да изчислим разликата между две дати и времена в T-SQL

Проблем:

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създадете клъстер на Amazon Aurora

  2. Свързване на RazorSQL към Salesforce.com

  3. Разширен SQL:Вмъкнете изхода на параметризираната функция със стойност на таблица в SQL таблица

  4. SQL COUNT() за начинаещи

  5. WordPress – Зад кулисите, част 1