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

Откуда:
Сообщений: 16
Привет Всем!
Хочу сделать вьюху со списком людей у котрых день рождения будет ровняться заданному периоду напоминания lib_Msrok

Например:
Сегодня 2014-03-17

|FIO |BirthDate |lib_Msrok|
|Ivanov VV |1982-03-07| 7 | У него прошло день рождение он не попадает в писок
|Petrov SV |1987-03-20 | 6 | У него условие совпало он попал в список

Бьюсь уже второй день нифина не получается
17 мар 14, 09:37    [15736046]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
Владимир Маньков
Member

Откуда:
Сообщений: 16
Владимир Маньков,

Например:
Сегодня 2014-03-17

db_view_all_birthday
|FIO |BirthDate |lib_Msrok|
|Ivanov VV |1982-03-07| 7 | У него прошло день рождение он не попадает в писок
|Petrov SV |1987-03-20 | 6 | У него условие совпало он попал в список

Написал вот такой запрос где выводит всех людей у которых ДР больше текущей даты, а вот как быть с периодом немогу
SELECT *,
right(CONVERT(date, BirthDate, 112),4) a,
right(CONVERT(date, getdate(), 112),4)b
FROM db_view_all_birthday
where
(right(CONVERT(date, BirthDate, 112),4) >
right(CONVERT(date, getdate(), 112),4))
17 мар 14, 09:54    [15736121]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
П-Л
Guest
http://technet.microsoft.com/ru-ru/library/ms187081(v=sql.90).aspx
17 мар 14, 10:03    [15736170]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
petre
Member

Откуда: Кривой Рог
Сообщений: 42
Владимир Маньков
Владимир Маньков,

Например:
Сегодня 2014-03-17

db_view_all_birthday
|FIO |BirthDate |lib_Msrok|
|Ivanov VV |1982-03-07| 7 | У него прошло день рождение он не попадает в писок
|Petrov SV |1987-03-20 | 6 | У него условие совпало он попал в список

Написал вот такой запрос где выводит всех людей у которых ДР больше текущей даты, а вот как быть с периодом немогу
SELECT *,
right(CONVERT(date, BirthDate, 112),4) a,
right(CONVERT(date, getdate(), 112),4)b
FROM db_view_all_birthday
where
(right(CONVERT(date, BirthDate, 112),4) >
right(CONVERT(date, getdate(), 112),4))

select * FROM db_view_all_birthday
where 
getdate() between dateadd(day, -lib_Msrok, BirthDate) and dateadd(day, lib_Msrok, BirthDate)
17 мар 14, 10:09    [15736202]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2396
petre
getdate() between dateadd(day, -lib_Msrok, BirthDate) and BirthDate
17 мар 14, 10:12    [15736218]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
aleks2
Guest
StarikNavy
petre
getdate() between dateadd(day, -lib_Msrok, BirthDate) and BirthDate


Грудничков тока проздравляем?
17 мар 14, 10:18    [15736248]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
Владимир Маньков
Member

Откуда:
Сообщений: 16
petre
select * FROM db_view_all_birthday
where 
getdate() between dateadd(day, -lib_Msrok, BirthDate) and dateadd(day, lib_Msrok, BirthDate)


В Вашем коде просчитает только дни, а как быть с месяцем?
17 мар 14, 10:26    [15736290]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
petre
Member

Откуда: Кривой Рог
Сообщений: 42
Прошу прощения за утреннюю спешку:
select * FROM db_view_all_birthday
where 
dateadd(year, -datepart(year, getdate()), getdate()) between dateadd(day, -lib_Msrok, dateadd(year, -datepart(year,BirthDate),  dateadd(year, -datepart(year,BirthDate)) and dateadd(day, lib_Msrok, dateadd(year, -datepart(year,BirthDate),  dateadd(year, -datepart(year,BirthDate)) 

БУдто бы должно получиться))
17 мар 14, 10:47    [15736390]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
petre
Member

Откуда: Кривой Рог
Сообщений: 42
petre,

select * FROM @db_view_all_birthday
where 
dateadd(year, 1900-datepart(year, getdate()), getdate()) 
between dateadd(year, 1900-datepart(year, dateadd(day, -lib_Msrok, BirthDate)), dateadd(day, -lib_Msrok, BirthDate)) 
    and dateadd(year, 1900-datepart(year, dateadd(day, lib_Msrok, BirthDate)), dateadd(day, lib_Msrok, BirthDate)) 

теперь получилось. + необходимо добавить усечение времени, если есть необходимость.
тестировал на SQL2000 )
17 мар 14, 11:10    [15736557]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
Владимир Маньков
Member

Откуда:
Сообщений: 16
Спасибо всем за помощь!

Мне немного упростили задачу и убрали lib_Msrok и сказали чтобы тупо брал за 7 дней

и я решил задачу следующим образом:

SELECT *, CAST(BirthDate_current - CAST(CONVERT(nvarchar(10), GETDATE(), 20) AS datetime) AS int) AS nd
FROM dbo.event_lib_birthday
WHERE (CASE WHEN month(BirthDate) * 30 + day(BirthDate) - (month(getdate()) * 30 + day(getdate())) BETWEEN 0 AND 7 THEN 1 ELSE 0 END = 1)
ORDER BY nd
17 мар 14, 13:54    [15738081]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
petre
Member

Откуда: Кривой Рог
Сообщений: 42
Владимир Маньков,
вышеуказанный запрос не пробовали?
Замените lib_Msrok на 7 и попробуйте)
17 мар 14, 13:57    [15738113]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
Владимир Маньков
Member

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

спасибо Вам!
да запрос попробовал, единственно один минус вышел
т.к. getdate с текущим временем то запрос зацепил человека у которого ДР было вчера
17 мар 14, 14:05    [15738178]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
BirthDate
Guest
Владимир Маньков
Спасибо всем за помощь!

Мне немного упростили задачу и убрали lib_Msrok и сказали чтобы тупо брал за 7 дней

и я решил задачу следующим образом:

SELECT *, CAST(BirthDate_current - CAST(CONVERT(nvarchar(10), GETDATE(), 20) AS datetime) AS int) AS nd
FROM dbo.event_lib_birthday
WHERE (CASE WHEN month(BirthDate) * 30 + day(BirthDate) - (month(getdate()) * 30 + day(getdate())) BETWEEN 0 AND 7 THEN 1 ELSE 0 END = 1)
ORDER BY nd



чуть чуть поправил ваш код так, чтобы можно было задавать "текущую дату" и убрал все незначимые поля

declare @getdate datetime = '20131228'

SELECT *
FROM (
	select '20140101' as BirthDate
) a
WHERE (CASE WHEN month(BirthDate) * 30 + day(BirthDate) - (month(@getdate) * 30 + day(@getdate)) BETWEEN 0 AND 7 THEN 1 ELSE 0 END = 1) 
17 мар 14, 14:10    [15738228]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
o-o
Guest
у вас что, во всех месяцах по 30 дней?
не пробовали вместо getdate() подставить последние числа февраля, а еще лучше, декабря?
вот пример:

declare @t table (BirthDate datetime);
insert into @t (BirthDate)
values ('19750227'), ('19750304'), ('19750305'),
('19751231'), ('19760101'), ('19760102')

SELECT *, CAST(BirthDate - CAST(CONVERT(nvarchar(10), GETDATE(), 20) AS datetime) AS int) AS nd
FROM @t
WHERE (CASE WHEN month(BirthDate) * 30 + day(BirthDate) - (month('20130227') * 30 + day('20130227')) BETWEEN 0 AND 7 THEN 1 ELSE 0 END = 1)
ORDER BY nd 
-------------------------------------------
1975-02-27 00:00:00.000	-14263
1975-03-04 00:00:00.000	-14258

SELECT *, CAST(BirthDate - CAST(CONVERT(nvarchar(10), GETDATE(), 20) AS datetime) AS int) AS nd
FROM @t
WHERE (CASE WHEN month(BirthDate) * 30 + day(BirthDate) - (month('20131230') * 30 + day('20131230')) BETWEEN 0 AND 7 THEN 1 ELSE 0 END = 1)
ORDER BY nd 
-------------------------------------------
1975-12-31 00:00:00.000	-13956


на 2013-02-27, если выполните ваш запрос, потеряете товарища, родившегося 1975-03-05,
а выполнив ваш запрос 2013-12-30, теряете всех, родившихся в первых числах января
17 мар 14, 14:12    [15738250]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Так что там с 29 февраля? А?
Раз в 4 года их замечать или как?
17 мар 14, 14:58    [15738758]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
Владимир Маньков
Member

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

Насчёт 29 февраля не особая проблема, просто он появится днем позже выборка же идёт 0-7 дней
а насчёт конца года надо будет просто проверку добавить
17 мар 14, 15:30    [15739091]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
prog882
Guest
Владимир Маньков,
with t as (
select convert(date,'19800317',104) as bd, 'Ivanov' as ln union all
select convert(date,'19810307',104) as bd, 'Petrov'  as ln union all
select convert(date,'19790228',104) as bd, 'Smirnov' as ln union all
select convert(date,'19820320',104) as bd, 'Sidorov' as ln )
select *
from t
where dateadd(yyyy,datediff(yyyy,bd,getdate()),bd) between convert(date,getdate(),104) 
    and dateadd(d,7,convert(date,getdate(),104))
17 мар 14, 15:42    [15739192]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Могу кинуть пару ссылок на темы, где сам участвовал,
но в Вашем случае, наверно, можно упростить

Как быстро определить сколько лет человеку по дате рождения

Определение возраста по дате рождения и тек.дате
17 мар 14, 15:43    [15739201]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
o-o
Guest
prog882,
и вы туда же.
ну, не 17 марта сегодня, а 31 декабря.
подставьте канун нового года в свой код и посмотрите, вернет ли родившихся в первых числах января
with t as (
select convert(date,'19800101',104) as bd, 'Ivanov' as ln) 
select *
from t
where dateadd(yyyy,datediff(yyyy,bd,'20131231'),bd) between convert(date,'20131231',104) 
    and dateadd(d,7,convert(date,'20131231',104))
17 мар 14, 15:51    [15739280]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
aleks2
Guest
Да уж... мудрецы...

Проще надо и эффективней
set nocount on;

declare @t table (BirthDate date);
insert into @t (BirthDate)
values ('19750227'), ('19750318'), ('19750305'),
('19751231'), ('19760101'), ('19760102')

declare @lib_Msrok int = 7, @now date = getdate()

-- жизнь человеческая ОЧЕНЬ коротка
declare @intervals table (b date primary key clustered, e date);

declare @i int = 200; -- двести лет... аднако. Можно сто оставить.

while  @i > 0 -- ну, while можно заменить таблицей с натуральными числами
begin
  insert @intervals values(DATEADD(YEAR, -@i, @now), DATEADD(day, @lib_Msrok, DATEADD(YEAR, -@i, @now)));
  set @i = @i - 1;
end;

-- и... следите за руками. Никаких проблем с 29 февраля и прочими надуманными сложностями
select t.*
  from @t t inner join @intervals i on i.b <= t.BirthDate and t.BirthDate <= i.e;
17 мар 14, 16:02    [15739389]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
o-o
Guest
по-моему, еще проще совсем "в лоб".
посчитать число полных лет на сегодня: DATEDIFF(YEAR, BirthDate, getdate())
и, чтоб не обламываться с последними числами года,
еще +1 в кач-ве варианта: DATEDIFF(YEAR, BirthDate, getdate()) + 1
теперь это прибавим к дате рождения.
если хоть одна из полученных дат лежит в интервале от сегодняшнего утра
до сегодня + 7 дней (по вкусу 7 замените да заданное число дней), то клиент -- "наш":

select BirthDate 
from @t
where (DATEADD(YEAR,DATEDIFF(YEAR, BirthDate, getdate()),BirthDate) between cast (getdate() as date)
      and dateadd(day, 7 ,cast (getdate() as date))) 
      or
      (DATEADD(YEAR,DATEDIFF(YEAR, BirthDate, getdate()) + 1,BirthDate)  between cast (getdate() as date)
      and dateadd(day, 7 ,cast (getdate() as date))) 
17 мар 14, 19:40    [15741023]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
prog882
Guest
declare @td date = convert(date,'20131230',104);
with t as (
select convert(date,'19800101',104) as bd, 'Ivanov' as ln union all
select convert(date,'19810307',104) as bd, 'Petrov'  as ln union all
select convert(date,'19790228',104) as bd, 'Smirnov' as ln union all
select convert(date,'19820320',104) as bd, 'Sidorov' as ln )
select *
from t 
where dateadd(yyyy,case when dateadd(yyyy,datediff(yyyy,bd,@td),bd) < @td then 1 else 0 end, dateadd(yyyy,datediff(yyyy,bd,@td),bd))
between @td and dateadd(dd,7,@td);
18 мар 14, 09:25    [15742989]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
prog882
declare @td date = convert(date,'20131230',104);
Странная строка
18 мар 14, 09:31    [15743020]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
Владимир Маньков,

declare @BirthDate date = '20040228',
	@Now date = '20130307';

select 1
where datepart(dy, @now) between datepart(dy, @BirthDate) - 7 and datepart(dy, @BirthDate) + 7;
Поиграйтесь со значениями переменных, сами все увидите.

Но в плане производительности лучше так, как aleks2 советует.
18 мар 14, 10:16    [15743247]     Ответить | Цитировать Сообщить модератору
 Re: Help День рождения  [new]
o-o
Guest
Ennor Tiegael
Владимир Маньков,

declare @BirthDate date = '20040101',
	@Now date = '20131231';

select 1
where datepart(dy, @now) between datepart(dy, @BirthDate) - 7 and datepart(dy, @BirthDate) + 7;
Поиграйтесь со значениями переменных, сами все увидите.

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


с первыми числами года так и пролетает
18 мар 14, 12:23    [15744281]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить