Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как переписать логику  [new]
sqI
Member [заблокирован]

Откуда: http://rstudio.at.ua
Сообщений: 1667
Есть вот такого плана логика. Нужно определить входит дата в период или нет. Чет загруз, под вечер голова уже почти не соображает :(

if '1900-01-01 05:30:00.000' between '1900-01-01 22:00:00.000' and '1900-01-01 06:00:00.000'
	print 'ok'
16 ноя 09, 17:40    [7935655]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать логику  [new]
iljy
Member

Откуда:
Сообщений: 8711
sqI,

@a between @b and @c

==

@a >= @b and @a <=@c
16 ноя 09, 17:43    [7935671]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать логику  [new]
Glory
Member

Откуда:
Сообщений: 104760
В between сначала должно идти меньшее значение, а потом большее. А не наоборот
16 ноя 09, 17:43    [7935674]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать логику  [new]
sqI
Member [заблокирован]

Откуда: http://rstudio.at.ua
Сообщений: 1667
ет все понятно, вот как раз копья ломаю когда задача в отрыве от даты. Тоесть период может задаваться просто как время от и до
16 ноя 09, 18:00    [7935793]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать логику  [new]
Glory
Member

Откуда:
Сообщений: 104760
sqI
ет все понятно, вот как раз копья ломаю когда задача в отрыве от даты. Тоесть период может задаваться просто как время от и до

Ну так все равно в between сначала придется ставить меньшее значение, а потом большее.
16 ноя 09, 18:01    [7935800]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать логику  [new]
sqI
Member [заблокирован]

Откуда: http://rstudio.at.ua
Сообщений: 1667
Glory
sqI
ет все понятно, вот как раз копья ломаю когда задача в отрыве от даты. Тоесть период может задаваться просто как время от и до

Ну так все равно в between сначала придется ставить меньшее значение, а потом большее.


битвин не принципиально, как без битвина переписать покороче
16 ноя 09, 18:04    [7935821]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать логику  [new]
iljy
Member

Откуда:
Сообщений: 8711
sqI,

вам только время надо сравнивать типа?
declare @d datetime, @d1 datetime, @d2 datetime
select @d='1900-01-01 05:30:00.000', @d1='1900-01-01 22:00:00.000',@d2='1900-01-01 06:00:00.000'

select case when @d between dateadd(d, datediff(day, 0, @d2 - @d1), @d1) and @d2 then 1 else 0 end
16 ноя 09, 18:06    [7935830]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать логику  [new]
Сергей Мишин
Member

Откуда:
Сообщений: 376
sqI
битвин не принципиально, как без битвина переписать покороче

покороче никак
16 ноя 09, 18:09    [7935855]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать логику  [new]
sqI
Member [заблокирован]

Откуда: http://rstudio.at.ua
Сообщений: 1667
iljy
sqI,

вам только время надо сравнивать типа?
declare @d datetime, @d1 datetime, @d2 datetime
select @d='1900-01-01 05:30:00.000', @d1='1900-01-01 22:00:00.000',@d2='1900-01-01 06:00:00.000'

select case when @d between dateadd(d, datediff(day, 0, @d2 - @d1), @d1) and @d2 then 1 else 0 end


не работает

declare @d datetime, @d1 datetime, @d2 datetime
select @d='1900-01-01 23:00:00.000', @d1='1900-01-01 22:00:00.000',@d2='1900-01-01 06:00:00.000'

select case when @d between dateadd(d, datediff(day, 0, @d2 - @d1), @d1) and @d2 then 1 else 0 end

16 ноя 09, 18:19    [7935911]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать логику  [new]
sqI
Member [заблокирован]

Откуда: http://rstudio.at.ua
Сообщений: 1667
у меня плавится мозк, наверно это будет хитрая джедайская методика через число Пи
16 ноя 09, 18:34    [7935979]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать логику  [new]
iljy
Member

Откуда:
Сообщений: 8711
sqI,

declare @d datetime, @d1 datetime, @d2 datetime
select @d='1900-01-01 7:00:00.000', @d1='1900-01-01 22:00:00.000',@d2='1900-01-01 06:00:00.000'

select
 case when @d2 > @d1 then
	case when @d between @d1 and @d2 then 1 else 0 end
		else
	case when @d >= @d1 or @d <= @d2 then 1 else 0 end
 end
16 ноя 09, 18:36    [7935983]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать логику  [new]
sqI
Member [заблокирован]

Откуда: http://rstudio.at.ua
Сообщений: 1667
гуд!
16 ноя 09, 18:53    [7936043]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать логику  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
автор
у меня плавится мозк, наверно это будет хитрая джедайская методика через число Пи
зачем усложнять ?.. можно через инверсию битов ;-)
declare @t table(d1 datetime, dx datetime, d2 datetime)
insert @t select '1900-01-01 09:50:00.000', '1900-01-01 22:00:00.000','1900-01-01 06:00:00.000'
insert @t select '1900-01-01 03:30:00.000', '1900-01-01 22:00:00.000','1900-01-01 06:00:00.000'
insert @t select '1900-01-01 06:00:00.000', '1900-01-01 22:00:00.000','1900-01-01 09:50:00.000'
insert @t select '1900-01-01 06:00:00.000', '1900-01-01 22:00:00.000','1900-01-01 03:30:00.000'
insert @t select '1900-01-01 09:50:00.000', '1900-01-01 09:50:00.000','1900-01-01 06:00:00.000'
insert @t select '1900-01-01 03:30:00.000', '1900-01-01 06:00:00.000','1900-01-01 06:00:00.000'

select d1,dx,d2
      ,res=isnull(case when (1+sign(~sign(mx-m1)))*1440 + mx between m1 and (1+sign(~sign(m2-m1)))*1440 + m2 then 1 end,0)
from(
  select d1,dx,d2
  ,m1=datepart(hh,d1)*60+datepart(mi,d1)
  ,mx=datepart(hh,dx)*60+datepart(mi,dx)
  ,m2=datepart(hh,d2)*60+datepart(mi,d2)
  from @t
)t
result:
d1dxd2res
1900-01-01 09:50:00.0001900-01-01 22:00:00.0001900-01-01 06:00:00.0001
1900-01-01 03:30:00.0001900-01-01 22:00:00.0001900-01-01 06:00:00.0000
1900-01-01 06:00:00.0001900-01-01 22:00:00.0001900-01-01 09:50:00.0000
1900-01-01 06:00:00.0001900-01-01 22:00:00.0001900-01-01 03:30:00.0001
1900-01-01 09:50:00.0001900-01-01 09:50:00.0001900-01-01 06:00:00.0001
1900-01-01 03:30:00.0001900-01-01 06:00:00.0001900-01-01 06:00:00.0001

PS. Точность сравнения до мс переделать, сами понимаете, несложно... :-)
16 ноя 09, 19:54    [7936293]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать логику  [new]
sqI
Member [заблокирован]

Откуда: http://rstudio.at.ua
Сообщений: 1667
--exec TestGetRegistrationsByRuleRD 'Targit_LKO3712_Sats2_Workdays', '2009-01-29', '2009-01-29', 3453
declare @SliceStartTime datetime
declare @SliceEndTime datetime

declare @StartTime datetime
declare @EndTime datetime

set @StartTime = '1900-01-01 05:00'
set @EndTime = '1900-01-01 08:00'

set @SliceStartTime = '1900-01-01 22:00'
set @SliceEndTime = '1900-01-01 06:00'

if(@SliceEndTime < @SliceStartTime) 
begin
	if(@StartTime < @SliceStartTime)
		set @StartTime = @SliceStartTime

	if(@EndTime < @SliceStartTime)
		set @EndTime = @SliceStartTime

end
else
begin
	if(@StartTime < @SliceStartTime)
		set @StartTime = @SliceStartTime

	if(@EndTime > @SliceEndTime)
		set @EndTime = @SliceEndTime
end

print @StartTime
print @EndTime

тот скрипт был несколько неполным, сейчас расклад такой

Задан период (Sliced), допустим 23-00 до 05-00

Чел работает с 21-00 до 9-00.

Нужно "подрезать" этот период по слайсед дате. Тоесть переработки ему не защитываются.
Тоесть работал вроде с 23-00 до 05-00 утра. Если пересекаются то тоже находим пересечение этих периодов
16 ноя 09, 20:28    [7936379]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать логику  [new]
sqI
Member [заблокирован]

Откуда: http://rstudio.at.ua
Сообщений: 1667
наконецто, почти методом тыка

declare @SliceStartTime datetime
declare @SliceEndTime datetime

declare @StartTime datetime
declare @EndTime datetime

set @StartTime = '1900-01-01 21:00'
set @EndTime = '1900-01-01 23:00'

set @SliceStartTime = '1900-01-01 06:00'
set @SliceEndTime = '1900-01-01 23:00'

if(@StartTime < @SliceStartTime 
   AND (@SliceStartTime < @SliceEndTime OR @StartTime > @SliceEndTime))
	set @StartTime = @SliceStartTime

if(@EndTime > @SliceEndTime
	AND (@EndTime < @SliceStartTime OR @SliceStartTime < @SliceEndTime))
	set @EndTime = @SliceEndTime

IF(@SliceStartTime < @SliceEndTime AND (@StartTime > @SliceEndTime OR @EndTime < @SliceStartTime))
  OR (@SliceStartTime > @SliceEndTime AND (@StartTime > @SliceEndTime AND @EndTime < @SliceStartTime ))
	print 'Not crosed'

print @StartTime
print @EndTime

16 ноя 09, 21:05    [7936442]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить