Разделите временные метки на 3 временных интервала - PullRequest
1 голос
/ 08 сентября 2010

У меня есть следующая проблема, где я должен сгруппировать различные транзакции в временные интервалы.Предположим, у вас есть таблица с записями, которые содержат дату и время записи.Эти записи создаются пользователями (операторами), которые работают в разные смены

Смена 1 : 5 - 13 ч // Смена 2 : 13 - 21 ч // Shift 3 : 21 - 5 ч

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

2010-09-08 06:12:00.000 --> 2010-09-08 05:00:00.000
2010-09-08 02:12:00.000 --> 2010-09-07 21:00:00.000

Я уже пробовал несколько запросов с использованием dateadd и datediff, но я не могу заставить его работать ... Кто-нибудь может помочь?Спасибо

Ответы [ 4 ]

1 голос
/ 08 сентября 2010
select
case 
  when datepart(hh, start_date) between 5 and 12
       then dateadd(hh, 5, dateadd(d, datediff(d, 0, start_date), 0))
  when datepart(hh, start_date) between 13 and 20
       then dateadd(hh, 13, dateadd(d, datediff(d, 0, start_date), 0))
  when datepart(hh, start_date) between 21 and 23
       then dateadd(hh, 21, dateadd(d, datediff(d, 0, start_date), 0))
  else dateadd(hh, 21, dateadd(d, datediff(d, 0, start_date)-1, 0))
end
from ...
0 голосов
/ 08 сентября 2010

Если ваша база данных поддерживает тип INTERVAL, вычтите пять часов из метки времени события, чтобы выровнять его относительно полуночи вместо 0500, и разделите временную часть на восемь часов, чтобы получить номер смены, проиндексированный с нуля.

Чтобы получить время начала смены, умножьте число смен на восемь часов, добавьте это к той части даты вычитания, которую вы делали выше, а затем добавьте пять дополнительных часов, чтобы привести ее в соответствие с вашим графиком смены.

Если вы собираетесь часто их запрашивать, возможно, лучше создать вторую таблицу, которая индивидуально идентифицирует каждую смену по идентификатору и времени его начала.Затем вы можете заполнить таблицу сдвигов, используя триггер ON INSERT для таблицы, содержащей ваши события, которая выполняет вычисление один раз, вставляет новую строку в таблицу сдвигов, если необходимо, и связывает с ней строку событий, используя внешний ключ.Это также даст вам гораздо более простой способ запрашивать все события, которые произошли во время определенной смены.

0 голосов
/ 08 сентября 2010
select 
    case
        --shift I   
        when datepart(HH, [TimeStamp]) >= 5 and datepart(HH, [TimeStamp]) < 13 then
            dateadd(HH, 5, dateadd(dd,0, datediff(dd,0,[TimeStamp])))
        --shift II
        when datepart(HH, [TimeStamp]) >= 13 and datepart(HH, [TimeStamp]) < 21 then
            dateadd(HH, 13, dateadd(dd,0, datediff(dd,0,[TimeStamp])))
        --shift III
        when datepart(HH, [TimeStamp]) >= 21 then               
            dateadd(HH, 21, dateadd(dd,0, datediff(dd,0,[TimeStamp])))
        when datepart(HH, [TimeStamp]) < 5 then         
            dateadd(HH, 21, dateadd(dd,0, datediff(dd,0,[TimeStamp])-1))                            
    end as StartTime
from 
    Table1
0 голосов
/ 08 сентября 2010

Как насчет этого ...?

select 
    case
        when datepart(Hh, dt) >= 5 AND datepart(Hh, dt) < 13 then 1
        when datepart(Hh, dt) >= 13 AND datepart(Hh, dt) < 21 then 2
        when datepart(Hh, dt) < 5 OR datepart(Hh, dt) >= 21 then 3
    end
from myTable
...