2016-08-25 6 views
1

Пусть говорят в моей таблице БД я следующие записиКак рассчитать общее количество минут до конца дня?

enter image description here

Теперь, как я могу получить общее количество минут, что студент 9652, затраченные на 2016-08-24 00:00:01 до 2016-08-24 23:59:59? Запрос, который я пробовал

SELECT Sum(Timestampdiff(minute, start, end_date)) AS shift_mins FROM 


`student_shift_history` WHERE student_id = 9652 


AND `start` BETWEEN '2016-08-24 00:00:01' AND '2016-08-24 23:59:59' 

Вышеуказанный запрос дает общую сумму минут следующего дня.

Мне нужны общие минуты, которые студент 9652 провел на 2016-08-24. Любая помощь будет оценена по достоинству.

ответ

2

Вы рассматриваете end_date для каждой строки. Вам нужно проверить, больше ли число end_date, чем дата окончания проверяемой даты.

я не могу попробовать это на данный момент, но псевдо-рабочий MySQL может выглядеть следующим образом:

SELECT Sum(
    Timestampdiff(minute, start, LEAST(end_date, '2016-08-24 23:59:59')) 
) AS shift_mins 
FROM 
    `student_shift_history` 
WHERE student_id = 9652 
AND `start` BETWEEN '2016-08-24 00:00:01' AND '2016-08-24 23:59:59' 

Запрос должен сказать:

Возьмите все записи, где начало дата находится в диапазоне, а затем для всех этих, суммируйте количество минут между временем начала и end_date или в конце дня, в котором я заинтересован, если это до end_date.


Вопрос о том, чтобы добавить оставшиеся минуты на следующий день имеет аналогичное решение.

Прежде всего, вы должны убедиться, что start обрабатывают в smiliar образом при расчете минут:

SELECT Sum(
    Timestampdiff(
     minute, 
     GREATEST(start, '2016-08-24 00:00:00'), 
     LEAST(end_date, '2016-08-24 23:59:59') 
    ) 
) AS shift_mins 

Подобно последнего изменения, это следующее:

  • Если start день назад, считайте только с самого начала, которое вас интересует
  • Если start - это некогда время, которое вас интересует, все как есть как и раньше

Теперь вам также необходимо скорректировать свой пункт WHERE, чтобы убедиться, что вы получаете все виды записей, которые вы хотите.Эти

  • отчетов, где оба start и end_date находятся в течение дня вы заинтересованы в
  • Records, где start это до дня вы заинтересованы в и end_date после того дня
  • записей, где start находится в течение дня, когда вас интересует, и end_date в этот день
  • Записи, где start - в течение дня, и end_date - после

Условием для этого является удивительно простым:

WHERE 
    start < `2016-08-24 23:59:59` AND end_date > `2016-08-24 00:00:00` 

Так весь оператор должен выглядеть следующим образом:

SELECT Sum(
    Timestampdiff(
     minute, 
     GREATEST(start, '2016-08-24 00:00:00'), 
     LEAST(end_date, '2016-08-24 23:59:59') 
    ) 
) AS shift_mins 
FROM 
    `student_shift_history` 
WHERE 
    student_id = 9652 AND 
    start < `2016-08-24 23:59:59` AND 
    end_date > `2016-08-24 00:00:00` 

Это должно работать. Если это не так, вы все равно получите изображение :-)

+0

спасибо человеку, он отлично поработал, но он поднимает еще один вопрос. Теперь, как я могу проверить оставшиеся минуты на следующий день? –

+0

Затем вы должны изменить свое условие. Я собираюсь изменить свой ответ. –

+0

, если вы могли бы задать вопрос, охватывающий оба сценария, это было бы очень оценено. –

Смежные вопросы