Разница во времени в SQL между записью и «определенным временем дня» - PullRequest
0 голосов
/ 02 марта 2011

У меня есть таблица в базе данных отношений, которая содержит много дат. В своей логике приложения я разделил один день на 4 части по 6 часов каждая, начиная с: 00:00, 06:00, 12:00 и 18:00. Теперь я хотел бы найти разницу во времени самой ранней записи в базе данных для каждого квартала дня и начала периода. Как я могу это сделать?

В psuedo-sql, я думаю, это выглядит как

select min(created_at - ROUND_DOWN_TO_6_HOURS(created_at)) from mytabel group by day_quater;

Проблема в том, как рассчитать "ROUND_DOWN_TO_6_HOURS". Таким образом, если значение «create_at» равно 19:15, оно будет округлено до 18:00, а «create_at - ROUND_DOWN_TO_6_HOURS (созданный_кат)» вернет 1:15 hourd

Я работаю с PSQL

Ответы [ 4 ]

1 голос
/ 02 марта 2011

Если вы просто пытаетесь найти записи, соответствующие этим диапазонам, вы можете просто использовать это в предложении WHERE, например

select * from myTable 
where datepart(hh, created_at) between 0 and 6

Если вы пытаетесь создать вычисляемое поле, которое будет иметь 00 или 06 ..., тогда вы можете использовать функцию "DatePart ()" в sql для извлечения часа ... DATEPART (чч, дата) ... Это вернет числовое значение 0, 1, 2, 3, ... 23, и вы можете вычислить поле, основанное на этом значении между двумя из ваших часов в списке ...

Вот пример ...

select 
case  
   when datepart(hh, add_dt) between 0 and 6 then 1 
   when datepart(hh, add_dt) between 7 and 12 then 2 
   when datepart(hh, add_dt) between 13 and 18 then 3 
   when datepart(hh, add_dt) between 19 and 24 then 4 
end  
from myTable 
where add_dt is not null
0 голосов
/ 02 марта 2011
select 
  record::time - (case
     when record::time >= '18:00' then '18:00'
     when record::time >= '12:00' then '12:00'
     when record::time >= '6:00' then '6:00'
     else '0:00' end
     )::time as difference
from my_table
0 голосов
/ 02 марта 2011

Мой PostgreSQL немного ржавый, но что-то вроде этого:

<code>select
    date_trunc('day',CreatedOn) [Day],
    min(case when date_part('hour',TIMESTAMP CreatedOn) < 6 then '00:00'
          when date_part('hour',TIMESTAMP CreatedOn) < 12 then '06:00'
          when date_part('hour',TIMESTAMP CreatedOn) < 18 then '12:00'
          else '18:00'
         end) [Quarter]
from MyTable
group by date_trunc('day',CreatedOn)
order by date_trunc('day',CreatedOn)
0 голосов
/ 02 марта 2011

Вы можете использовать CASE в сочетании с вашими столбцом даты и функциями datetime, чтобы установить четверть дня (1,2,3,4) и извлечь дневную часть из значения datetime, сгруппировать по дням, кварталам изатем используйте MIN (yourdatecolumn), чтобы получить самое раннее время в каждой четверти группировки.

Не уверен, что вы подразумеваете под «началом периода».но вы можете измерить разницу между любой произвольной датой-временем и вашим набором самых ранних времен за день-квартал, который был создан вышеописанным способом.

http://www.postgresql.org/docs/8.2/static/functions-datetime.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...