Категоризация значения даты и времени по сменам, где смена заканчивается на следующий день - PullRequest
2 голосов
/ 01 октября 2019

У меня есть запрос MySQL, например:

select sum(qty) as qty
from myitem
where filedatetime >='2019-08-01 06:30:00'
  and filedatetime < '2019-09-01 18:30:00'

В моей таблице есть только столбцы qty и filedatetime.

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

  • если filedatetime имеет значение filedatetime> = '2019-08-01 06:30:00' и filedatetime <'2019-08-01 18:30:00' тогда <ul>
  • назначить значение'Day' для смещения столбца
  • присвойте столбцу shiftDate
, если filedatetime>> '2019-08-01 18:30:00 'и filedatetime <' 2019-08-02 06:30:00 'затем <ul> назначьте значение' Night 'для смещения столбца назначьте значение' 2019-08-01 'для столбца shiftDate

Вот так будет выглядеть результат:

shiftDate   |   Shift   |   QTY     |
2019-08-01  |   Day     |   10      |
2019-08-01  |   Night   |   12      |
2019-08-02  |   Day     |   11      |
2019-08-02  |   Night   |   15      |
2019-08-11  |   Day     |   11      |
2019-08-11  |   Night   |   18      |
2019-08-12  |   Day     |   13      |
2019-08-12  |   Night   |   19      |

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Вы можете использовать функцию Time() для извлечения части времени ( чч: мм: сс ) из значения даты и времени. После того, как мы определили это, мы можем использовать условное выражение CASE .. WHEN, чтобы проверить, смещается ли «дневной» или «ночной» на основе ваших определенных условий. Также мы можем использовать функцию Date() для извлечения части даты ( ГГГГ-мм-дд ) и добавления / вычитания 1 дня соответственно.

Затем мы можем GROUP BY по этим вычисленным выражениям и вычислить сумму qty;нет необходимости использовать подзапрос для дальнейшей агрегации:

SELECT 

  -- Determining day of the shift
  CASE 
     -- When below 06:30:00 then previous day's Night shift
     WHEN TIME(filedatetime) < '06:30:00'
     THEN DATE(filedatetime) - INTERVAL 1 DAY
     -- Else When >= 06:30:00 then current day's shift
     ELSE DATE(filedatetime)
  END AS shiftDate, 

  -- Determining Night / Day
  CASE 
      -- When between 06:30:00 (inclusive) and 18:30:00 then Day
      WHEN TIME(filedatetime) >= '06:30:00' AND TIME(filedatetime) < '18:30:00'
      THEN 'Day'
      ELSE 'Night'
  END AS shift, 

  -- Do aggregation
  SUM(qty) AS qty 
FROM myitem 
WHERE filedatetime >='2019-08-01 06:30:00'
  AND filedatetime < '2019-09-01 18:30:00'
GROUP BY shiftDate, shift
0 голосов
/ 01 октября 2019

Вы должны иметь возможность использовать функции time напрямую:

select mi.*,
       (case when cast(filedatetime as time) >= '06:30:00' and
                  cast(filedatetime as time) < '18:30:00'
             then 'day' else 'night'
        end) as shift
from myitem mi;

В MySQL вы также можете использовать функцию time(filedatetime) вместо cast().

...