Тип данных Time в SQL 2005?

Antony GL
Дата: 21.02.2013 12:37:12
Добрый день.
Прошу подсказать.
Есть (в процессе разработки) БД, в режиме совместимости MS SQL 2005 (90).
Работа ведется с двух компьютеров, на стационарном развернут MS SQL Express 2008 R2, на ноутбуке MS SQL Express 2005.
Вопрос в следующем. В базе происходит регистрация событий (smalldatetime) в таблице, есть вторая таблица с переменными значениями времени, и в запросе информация обрабатывается и выводится результат.
К примеру, событие 1 зарегистрировано 20.02.2013 08:01:00. Событие 2 зарегистрировано 20.02.2013 16:58:00.
В таблице, которая содержит переменные значения, мне нужно установить записи, содержащие время, без даты: переменная_1 08:00:00 и переменная_2 17:00:00.
Все было бы хорошо, но в 2005 SQL я не нашел тип переменной: time. Как я понял, он присутствует только в 2008 и новее. Остается использовать smalldatetime для обеспечения совместимости?
Запрос мне видится примерно таким (упрощенно): событие 1.время - переменная_1.время + переменная 2 - событие 2.время, для того чтобы подсчитать отклонение регистрации события от нормы для каждого дня.
Паганель
Дата: 21.02.2013 12:40:18
Antony GL
отклонение регистрации события от нормы для каждого дня.
это интервал что ли?
Гость333
Дата: 21.02.2013 12:44:37
Antony GL
на ноутбуке MS SQL Express 2005.
в 2005 SQL я не нашел тип переменной: time

Ну установите на ноутбук MS SQL Express 2008 R2 и используйте тип данных time.

Antony GL
Запрос мне видится примерно таким (упрощенно): событие 1.время - переменная_1.время + переменная 2 - событие 2.время, для того чтобы подсчитать отклонение регистрации события от нормы для каждого дня.

Ничего не понял. Можно это же самое выразить в T-SQL?
Antony GL
Дата: 21.02.2013 12:45:26
Паганель
Antony GL
отклонение регистрации события от нормы для каждого дня.
это интервал что ли?

Не совсем. В прикладном интересе будет интересно лишь абсолютная цифра (модуль) обоих отклонений за каждый день.
В приведенном примере отклонение составит 3 минуты за 20.02.2012
Паганель
Дата: 21.02.2013 12:48:41
Antony GL
В приведенном примере отклонение составит 3 минуты за 20.02.2012
может, просто хранить целое число 3 ?
Antony GL
Дата: 21.02.2013 14:14:26
Гость333
Antony GL
на ноутбуке MS SQL Express 2005.
в 2005 SQL я не нашел тип переменной: time

Ну установите на ноутбук MS SQL Express 2008 R2 и используйте тип данных time.

Antony GL
Запрос мне видится примерно таким (упрощенно): событие 1.время - переменная_1.время + переменная 2 - событие 2.время, для того чтобы подсчитать отклонение регистрации события от нормы для каждого дня.

Ничего не понял. Можно это же самое выразить в T-SQL?


Для этого нужен XP SP3 минимум, а установленная система XP SP2 на ноутбуке.

Накидал t-sql.

declare @event1 smalldatetime
declare @event2 smalldatetime
declare @start smalldatetime
declare @finish smalldatetime

set @event1 = '20100220 08:01:00'
set @event2 = '20100220 16:58:00'
set @start = '08:00:00'
set @finish = '17:00:00'

--set @start = datepart(hh, '08:00:00')
select start - возвращает какую-то фигню, а не часы :(

select datediff (hh, @event2, @event1) - работает и показывает разницу
Antony GL
Дата: 21.02.2013 14:16:43
Antony GL
select start - возвращает какую-то фигню, а не часы :(



select @start конечно же.

Проблема в том, что мне нужно знать разницу между определенным временем (контрольным) и временем когда событие случилось, для каждого дня (записи).
Cygapb-007
Дата: 21.02.2013 14:38:20
declare @table1 table (id int identity, shtamp datetime)
insert @table1 values ('20130220 08:01'), ('20130220 16:58'), ('20130220 14:30'), ('20130220 14:31')
declare @timing table (times datetime)
insert @timing values('19000101 08:00'), ('19000101 12:00'), ('19000101 17:00'), ('19000101 21:00')

select *, DATEPART(HOUR, t.shtamp)*60+DATEPART(MINUTE, t.shtamp) - DATEPART(HOUR, a.times)*60-DATEPART(MINUTE, a.times) deviation
from @table1 t
cross apply(
   select top(1) g.*
   from @timing g
   order by ABS(DATEPART(HOUR, t.shtamp)*60+DATEPART(MINUTE, t.shtamp) - DATEPART(HOUR, g.times)*60-DATEPART(MINUTE, g.times))
   )a
Cygapb-007
Дата: 21.02.2013 16:25:36
Даже, я бы сказал, так:
declare @table1 table (id int identity, shtamp datetime)
insert @table1 values ('20130220 08:01'), ('20130220 16:58'), ('20130220 14:30'), ('20130220 14:31')

if OBJECT_ID('timing') is null begin
   create table timing (times datetime, eval as DATEPART(HOUR, times)*60-DATEPART(MINUTE, times) PERSISTED CONSTRAINT PK_timing PRIMARY KEY)
   insert timing values('19000101 08:00'), ('19000101 12:00'), ('19000101 17:00'), ('19000101 21:00')
end

select *
from @table1 t
cross apply (
   select min(ABS(a.dev))deviation
   from timing g
   cross apply (select DATEPART(HOUR, t.shtamp)*60+DATEPART(MINUTE, t.shtamp)-g.eval dev) a
   ) c

-- drop table timing