powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как узнать завтрашних именинников?
63 сообщений из 63, показаны все 3 страниц
Как узнать завтрашних именинников?
    #37731832
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я совсем запутался.

Есть таблица:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
recreate table td(mem_date date);
insert into td(mem_date)values('30-Mar-2008');
insert into td(mem_date)values('30-Mar-2009');
insert into td(mem_date)values('30-Mar-2010');
insert into td(mem_date)values('30-Mar-2011');
insert into td(mem_date)values('31-Mar-2008');
insert into td(mem_date)values('31-Mar-2009');
insert into td(mem_date)values('31-Mar-2010');
insert into td(mem_date)values('31-Mar-2011');
insert into td(mem_date)values('01-Apr-2008');
insert into td(mem_date)values('01-Apr-2009');
insert into td(mem_date)values('01-Apr-2010');
insert into td(mem_date)values('01-Apr-2011');



Пробуем узнать, есть ли завтра причина для пьянки:
Код: sql
1.
2.
3.
4.
5.
select
  *
from td
where 
  extract(yearday from mem_date) = extract(yearday from dateadd(1 day to current_date))


Хм. Не то. А если
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
select
  *
from td
where 
  (--до 28 февраля включительно все без проблем
  extract(yearday from current_date) < 60
  and extract(yearday from mem_date) = extract(yearday from dateadd(1 day to current_date))
  )
  or --если именинник в невысокосном году и текущий год невысокосный
  (mod(extract(year from current_date), 4) > 0
   and mod(extract(year from mem_date), 4) > 0
   and extract(yearday from mem_date) = extract(yearday from dateadd(1 day to current_date))
  )
  or --если именинник в высокосном году и текущий год высокосный
  (mod(extract(year from current_date), 4) = 0
   and mod(extract(year from mem_date), 4) = 0
   and extract(yearday from mem_date) = extract(yearday from dateadd(1 day to current_date))
  )
  or --если именинник в невысокосном году, а текущий год высокосный
  (mod(extract(year from current_date), 4) = 0
   and mod(extract(year from mem_date), 4) > 0
   and extract(yearday from current_date) > 60
   and extract(yearday from mem_date) = extract(yearday from dateadd(0 day to current_date))
   )
  or --если именинник в высокосном году, а некущий год невысокосный
  (mod(extract(year from current_date), 4) > 0
   and mod(extract(year from mem_date), 4) = 0
   and extract(yearday from current_date) > 60
   and extract(yearday from mem_date) = extract(yearday from dateadd(-1 day to current_date))
   )


Уже лучше, но я не уверен, что я все проверки сделал правильно и учел все нюансы с датами.

И вообще, может есть более простой/правильный путь?
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #37731849
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonline,

Код: sql
1.
where memdate-current_date = 1
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #37731855
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m,

На приведенных в первом посте данных для сегодняшнего дня видает NULL. Еще идеи?
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #37731865
Фотография arni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а зачем весь геморой с yearday?
не проще проверять day и month?
композитный индекс в помощь.

p.s. придется особым образом обработать только родившихся 29.02, если есть строгое указание не промогать ни одного повода для пьянки.
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #37731875
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonlinem7m,

На приведенных в первом посте данных для сегодняшнего дня видает NULL. Еще идеи?

ууу, я протупил, по поводу сути задачи
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #37731926
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonline,

ну что то вот такое

(Месяц(current_date+1) = месяц(mem_date) and День(current_date+1) = День(mem_date))
или
(месяц(mem_date) = 2 and День(mem_date) = 29 and Месяц(current_date+1) = 3 and День(current_date+1)=1
and not ( Месяц(current_date+1) = 2 и День(current_date+1)=29))

если родившихся 29 февраля будут "обмывать" 1-го марта
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #37731943
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arniа зачем весь геморой с yearday?
не проще проверять day и month?
композитный индекс в помощь.

p.s. придется особым образом обработать только родившихся 29.02, если есть строгое указание не промогать ни одного повода для пьянки.

Один день на четыре года можно и пропустить. Хотя, конечно, нежелательно - там у меня как раз племянник родился :)
Геморой с yearday потому, что на тот момент это было первое что пришло в голову.
Спасибо за идею, запрос с этажерки в первом посте сократился до
Код: sql
1.
2.
3.
4.
5.
6.
select
  *
from td
where 
  extract(month from mem_date) = extract(month from dateadd(1 day to current_date))
  and extract(day from mem_date) = extract(day from dateadd(1 day to current_date))


//Пошел прогонять его на всех возможных датах для поиска ошибки.
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #37731957
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m,

Да, спасибо - как раз на 29 февраля мой запрос и будет сыпаться.
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #37731969
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такой запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select
  *
from td
where 
  (
  extract(month from mem_date) = extract(month from dateadd(1 day to :current_date))
  and extract(day from mem_date) = extract(day from dateadd(1 day to :current_date))
  )
  or
  (
  extract(month from mem_date) = 2 and extract(day from mem_date) = 29
  and extract(month from dateadd(1 day to :current_date)) = 3
  and extract(day from dateadd(1 day to :current_date)) = 1
  )


у меня правильно переварил все даты, которые я ему подсунул.
Всем спасибо :)
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #37732007
Фотография arni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonline,

если хотите ускориться, тогда вычисляйте однократно
extract(month from dateadd(1 day to current_date))
и
extract(day from dateadd(1 day to current_date))
и передавайте в качестве переменных.

а то мой склероз шепчет, они будут вычисляться для каждой строки вновь и вновь.
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #37732021
Фотография Di_LIne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arniа зачем весь геморой с yearday?
не проще проверять day и month?
композитный индекс в помощь.

p.s. придется особым образом обработать только родившихся 29.02, если есть строгое указание не промогать ни одного повода для пьянки.
Прощее - сделать поле "MMDD" с индексом и не морщить ни кому голову: ни себе, ни серверу... :)
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #37732117
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonlineВот такой запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select
  *
from td
where 
  (
  extract(month from mem_date) = extract(month from dateadd(1 day to :current_date))
  and extract(day from mem_date) = extract(day from dateadd(1 day to :current_date))
  )
  or
  (
  extract(month from mem_date) = 2 and extract(day from mem_date) = 29
  and extract(month from dateadd(1 day to :current_date)) = 3
  and extract(day from dateadd(1 day to :current_date)) = 1
  )


у меня правильно переварил все даты, которые я ему подсунул.
Всем спасибо :)

и в высокосный год, родившиеся 29-го февраля будут праздновать день рождение два дня
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #37744666
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonline,

Ещё раз извиняюсь, продублировал теперь здесь.

Выборка персонала, с днём рождения в ближайшие 20 дней

Код: sql
1.
2.
3.
4.
select p.family, p.dtr  
    from personnel p
     where extract(yearday from p.dtr)-extract(yearday from cast('NOW' as date)) between 0 and 20
        or extract(yearday from p.dtr)-extract(yearday from cast('NOW' as date)) <20-365



Родившихся 29 февраля сей запрос отработал нормально, специально проверил
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #37744714
Oliph_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну ее, эту тему...

Модератор: Удалено.
У нас технический форум, религиозные аспекты мы не рассматриваем.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как узнать завтрашних именинников?
    #38379204
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zeon11miwaonline,

Ещё раз извиняюсь, продублировал теперь здесь.

Выборка персонала, с днём рождения в ближайшие 20 дней

Код: sql
1.
2.
3.
4.
select p.family, p.dtr  
    from personnel p
     where extract(yearday from p.dtr)-extract(yearday from cast('NOW' as date)) between 0 and 20
        or extract(yearday from p.dtr)-extract(yearday from cast('NOW' as date)) <20-365



Родившихся 29 февраля сей запрос отработал нормально, специально проверил

Для исполнения запроса в високосный год 365 заменить на 366, если лениво вспоминать, какой нонче год, то для определения количества дней в году выполнить запрос, предложенный в своё время KDV 3989390 :
Код: sql
1.
2.
select extract(yearday from cast('31.12.'||extract(year from current_date) as date))+1
from rdb$database
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38380175
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошая задачка :)
У меня вот такое получилось для сегодняшних (для завтрашних CURRENT_TIMESTAMP сменить на DATEADD(1 DAY TO CURRENT_TIMESTAMP).
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT Birthdate
  FROM (SELECT
          Birthdate,
          EXTRACT(MONTH FROM birthdate) as M_BD, EXTRACT(DAY FROM birthdate) as D_BD,
          EXTRACT(MONTH FROM CURRENT_TIMESTAMP) AS M_Now,
          EXTRACT(DAY FROM CURRENT_TIMESTAMP) AS D_Now,
          EXTRACT(YEARDAY FROM CAST('31.12.' || EXTRACT(YEAR FROM CURRENT_TIMESTAMP) AS DATE) + 1) AS Now_DayCnt
        FROM tabletest)
WHERE  -- Not 29/02 - simple case
       ( D_BD <> 29 AND M_BD <> 2 AND
         M_BD = M_Now AND D_BD = D_Now ) OR
       -- 29/02
       ( D_BD = 29 AND M_BD = 2 AND
         -- Leap year => Exact match
         (Now_DayCnt = 366 AND
          M_BD = M_Now AND D_BD = D_Now ) OR
         -- Not leap year => 29/02 = 01/03
         (Now_DayCnt = 365 AND
          M_Now = 3 AND D_Now = 1) )


Ценой джойна временных переменных условия запроса сокращены до удобочитаемого вида
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38383919
Konstantin.Ogorodov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В решении предложенном zeon11 содержится ошибка: нумерация дней для высокосных и не выскосных годов не будут совпадать на 1 день из-за 29 февраля.

По этой причине пришлось изобретать свой велосипед. Необходимо было найти именинников в указанном периоде (!!!), а не за 1 день. Ключевым приёмом в решении было вычисление "магического числа": номер месяца рождения * 100 + число рождения. Аналогичные преобразования были сделаны для интервала и таким образом в условии where для большинства случаев получаем условие "MagicNumber between IntervalStart and IntervalEnd". Отдельно нужно обрабатывать случай перехода интервала на следующий год, тогда: IntervalStart > IntervalEnd and (MagicNumber >= IntervalStart or MagicNumber < = IntervalEnd).

Дата дня рождения вычисляется путём добавления к дате рождения разницы в годах между последней и текущим годом. Однако если IntervalStart > IntervalEnd /* переход интервала на след. год */ and MagicNumber <= IntervalEnd, то нужно добавить ещё годик.

Готовый запрос не даю, дабы была возможность пошевелить мозгами самостоятельно... А может и потому, что запрос писался для MS SQL и переделывать под синтаксис FireBird нет желания.

P.S. MS SQL позволяет создать MagicNumber как вычисляемое поле с построением индекса по нему, что позволит сделать запрос эффективным на больших объёмах данных.
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384270
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konstantin.OgorodovP.S. MS SQL позволяет создать MagicNumber как вычисляемое поле с построением индекса по нему, что позволит сделать запрос эффективным на больших объёмах данных.ФБ тоже. Более того, можно сделать индекс по выражению и не хранить калькулируемое поле вообще.
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384366
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konstantin.Ogorodov,

корректно работает в случае, если год рождения был високосным?

P.S. Что за всеобщая эпидемия написания слова "високосный" через Ы?
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384500
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-BrutalP.S. Что за всеобщая эпидемия написания слова "високосный" через Ы?
А это привет с Украины ;) У нас это слово читается и пишется как «вЫсокосный» (украинская «и» по звучанию еквивалентна русской «ы»), соответственно так и «переводим» на братский язык (отталкиваясь от слова «высокий»). Так что это слово можно считать таким себе индикатором украинцев :)
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384563
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miwaonline,

ну так и пишите это слово "по-украински" :) Хотя, тогда получится "високосн и й"...
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384633
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Как узнать завтрашних именинников?"

Кто может задать этот вопрос и кому ответ на него нужен?
Очевидно, что этот вопрос актуален для людей кадровой службы, опасающихся пропустить день рождения сотрудников, не отметив уважаемых людей в приказе по учреждению и т.п. 20 дней запаса - срок, за который можно подготовится к любому событию.
Будет-ли сотрудник в списке 19 дней или 21 не столь важно, главное, что он всё это время будет в списке и его точно поздравят вовремя.
Городить трёхэтажный запрос ради формальной правильности - это конечно дело вкуса, но тогда следует уж идти до конца и учитывать, что високосный год это год, номер которого кратен четырём, за исключением годов, кратных 100, но года кратные 400 по-прежнему будут високосными.
Иными словами, 2000 год високосный, 2100, 2200, 2300 - не високосные, 2400 - високосный.
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384656
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все это легко организовывается через "рабочий календарь", разложенный на дни и месяцы. Но там обычно еще есть и кварталы, выходные, рабочие, праздничные дни и т.п. Штука полезная.
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384673
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zeon11,

Поскольку инициатор вопроса - я, то мне этот запрос нужен чтобы софт автоматически рассылал поздравительные СМС постоянным клиентам в день рождения. Так что о 20 днях ожидания и формальной правильности речь (в моем случае) не идет. Так же как и о именинниках в 2100 году - меня этот вопрос тоже вряд ли будет волновать :)

Поэтому и рабочий календарь, предложенный wadman-ом мне также не подходит.
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384677
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonlineПоэтому и рабочий календарь, предложенный wadman-ом мне также не подходит.
Причина и следствие не понятны. Что такое "рабочий календарь" тебе известно?

П.С. Можно и нужно на "ты", мне так проще.
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384692
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Черновой запрос при наличии правильного рабочего календаря:
Код: sql
1.
2.
3.
4.
select u.* from user u, calendar c
where e.birthday = c.date
and c.day >= current_date+1
and c.day < current_date+2 



Круто?
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384741
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Понял, осознал, проникся. Да, круто :)
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384760
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonline...Поскольку инициатор вопроса - я, то мне этот запрос нужен чтобы софт автоматически рассылал поздравительные СМС постоянным клиентам в день рождения...
А позвольте вставить свои 5 копеек в условия задачи, т.к. мне кажется что правильное решение кроется именно там ;)
И если потом найдется на него ответ, то технически (т.е. предложить код) уже не составить труда.
А сектет в том, когда Вы реально поздравляете своего лучшего друга/подругу с днем рожденья, если день рождения припадает на 29 февраля? Если ответ есть и + он однозначный (как минимум по традициям Вашей компании либо трудового коллектива), то остальное дело техники. Не правда ли?
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384786
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISmiwaonline...Поскольку инициатор вопроса - я, то мне этот запрос нужен чтобы софт автоматически рассылал поздравительные СМС постоянным клиентам в день рождения...
А позвольте вставить свои 5 копеек в условия задачи, т.к. мне кажется что правильное решение кроется именно там ;)
И если потом найдется на него ответ, то технически (т.е. предложить код) уже не составить труда.
А сектет в том, когда Вы реально поздравляете своего лучшего друга/подругу с днем рожденья, если день рождения припадает на 29 февраля? Если ответ есть и + он однозначный (как минимум по традициям Вашей компании либо трудового коллектива), то остальное дело техники. Не правда ли?
В каждом трудовом коллективе поздравляют по-своему. Трудовых коллективов, которые используют обсуждаемую возможность, сильно больше одного.
Так что - неправда.
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384803
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonline...
В каждом трудовом коллективе поздравляют по-своему. Трудовых коллективов, которые используют обсуждаемую возможность, сильно больше одного.
Так что - неправда.
А вот и нет. В других странах не знаю, но у нас есть традиция, что нельзя подравлять зарание. А значит д.р. 29 февраля не в високосный год празднуют и поздравляют 1-го марта.
(код не обсуждаем, говорим о теоритическом подходе :)
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384804
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В догонку:
мужикам конечно по.. всё равно, а вот дамы крайне суеверны ;)
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384809
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISmiwaonline...
В каждом трудовом коллективе поздравляют по-своему. Трудовых коллективов, которые используют обсуждаемую возможность, сильно больше одного.
Так что - неправда.
А вот и нет. В других странах не знаю, но у нас есть традиция, что нельзя подравлять зарание. А значит д.р. 29 февраля не в високосный год празднуют и поздравляют 1-го марта.

Давайте на миг допустим, что кроме отдела кадров существуют другие отделы и даже другие предприятия. Которые, например, отправляют клиентам поздравительную СМС в которой приглашают посетить свое заведение в день рождения клиента, обещая скидки и бонусы. Внимание, вопросс! Когда надо отправить СМС? Варианты ответа: день после дня рождения ибо мы суеверные, непосредственно день рождения ибо мы дотошные, день перед днем рождения ибо мы умные, день перед днем рождения учитывая праздники и выходные ибо мы опытные.

Ну же, подумайте. И обязательно учтите суеверия. Можете даже исключить пятницы тринадцатого, чтобы веселее считалось.
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384815
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonlineмне этот запрос нужен чтобы софт автоматически рассылал поздравительные СМС постоянным клиентам в день рождения.
...
Понял, осознал, проникся. Да, круто :)
мда. написал на это ответ, и пришлось стереть, потому что внезапно...
miwaonlineВнимание, вопросс! Когда надо отправить СМС?
Ты же сам (см. цитату выше) сказал практически обратное. Вообще, например рестораны, предоставляют скидку не только в день ДР, но и в интервале "неделя после ДР".
А если человеку исполняется 40 лет - не поздравлять? А если праздники от ДР будут тоже неделю, а контора работает только в рабочие дни? А если контора в один из дней этой недели забронирована на корпоратив?
И что, все равно "нет, мне не нужен рабочий календарь"?
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384818
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonlineНу же, подумайте. И обязательно учтите суеверия. Можете даже исключить пятницы тринадцатого
я не понял, зачем мне думать о том, как тебе задачу решать :-) И лично мне очень нравится пятница 13, и суббота 14, хоть у меня ДР 28.
p.s. а еще давайте вспомним цифру 4, и прочее. И что католики или баптисты могут обидеться, если их поздравить с православным рождеством. И что ... слишком много поздравлений - это уже спам. И т.д.
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384821
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv> я не понял, зачем мне думать о том, как тебе задачу решать :-)
kdv> И лично мне очень нравится пятница 13, и суббота 14, хоть у меня ДР 28.

Люблю я иногда Диму почитать...
Аж на душе веселее становится. :)

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384823
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

ну, 28 не страшное число. :-) А про ДР в пятницу 13 нужно спрашивать у кого он так выпадает.
С суевериями вообще не угадаешь. У меня знакомый, который страшно боится, когда любая кошка перебегает дорогу перед его машиной. Он тут же тормозит, и ждет, когда кто-то "переедет" ее след.
С суевериями и прочим вообще нельзя угадать, я про баптистов не зря сказал, у меня был такой случай.
В общем, я бы не стал преумножать условия без необходимости.
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384830
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv> ну, 28 не страшное число

Да я не про числа, а вообще. :)

kdv> У меня знакомый, который страшно боится, когда любая кошка перебегает дорогу
kdv> перед его машиной. Он тут же тормозит, и ждет, когда кто-то "переедет" ее след.

О, у меня ещё круче случай был, может рассказывал.
В общем, как-то летом рано утром (то ли часов в 6,
то ли ещё раньше) еду на такси встречать друга.

Дорогу тоже перебегает чёрная кошка - самая что ни
на есть чёрная как в фильмах - таксист по тормозам,
поворачивается ко мне и спрашивает "Вы не будете
против, если я объеду это место?" У меня запас по
времени был достаточно большой, я и не возражаю.
Так он, бедолага, чуть ли не километр там крюка дал,
чтобы объехать это место... Потом ехал и в дороге
рассказывал истории про черную кошку и машины
и извинялся, что суеверный. :)

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384897
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvmiwaonlineмне этот запрос нужен чтобы софт автоматически рассылал поздравительные СМС постоянным клиентам в день рождения.
...
Понял, осознал, проникся. Да, круто :)
мда. написал на это ответ, и пришлось стереть, потому что внезапно...
miwaonlineВнимание, вопросс! Когда надо отправить СМС?
Ты же сам (см. цитату выше) сказал практически обратное. Вообще, например рестораны, предоставляют скидку не только в день ДР, но и в интервале "неделя после ДР".
А если человеку исполняется 40 лет - не поздравлять? А если праздники от ДР будут тоже неделю, а контора работает только в рабочие дни? А если контора в один из дней этой недели забронирована на корпоратив?
И что, все равно "нет, мне не нужен рабочий календарь"?
Дима, при всем моем уважении - ты пиво пил?
Я же уже ответил, что осознал и проникся - рабочий календарь нужен. А иронизировал насчет суеверий в ответе на предложение AIS о переносе 29 февраля на 1 марта.
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38384977
Konstantin.Ogorodov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fr0sT-Brutal,
Касательно в и сокосного года:
1. Именинников, родившихся 29 февраля будут поздравлять 28 февраля в не в и сокосный год. Такой вариант решения предлагает microsoft: если к 29 февраля добавить, например, годик. Меня этот подход устраивает.
2. В слове в и сокосный я допустил ошибку. Спасибо вам за поправку.
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38385037
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvУ меня знакомый, который страшно боится, когда любая кошка перебегает дорогу перед его машиной. Он тут же тормозит, и ждет, когда кто-то "переедет" ее след.
...и ему тут же прилетает в задницу другое авто :)

Konstantin.Ogorodov1. Именинников, родившихся 29 февраля будут поздравлять 28 февраля в не високосный год. Такой вариант решения предлагает microsoft: если к 29 февраля добавить, например, годик. Меня этот подход устраивает.
Вот это странное решение. Не все то разумно, что от Микрософта. Я бы посоветовал опросить хотя бы нескольких людей, имевших беду родиться в этот злополучный бестолковый день. Потому что примета о поздравлении заранее все же крайне сильна.
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38385045
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-BrutalЯ бы посоветовал опросить хотя бы нескольких людей, имевших беду родиться в этот злополучный бестолковый день. Потому что примета о поздравлении заранее все же крайне сильна.
Да, microsoft сплоховал тут.
авторКогда отмечать день рождения, если он приходится на 29 февраля, а год – не високосный? Вообще не отмечать – обидно, но дня то нет… так что же делать?

А вот здесь вы заблуждаетесь, что «дня то нет…». Есть. 29 февраля бывает КАЖДЫЙ ГОД! И «выплывает» он ровно на одну минуту: от 00 час.00 мин. до 00 час.01 мин. М-да, маловато, однако, для «отмечания»! Но не печальтесь, всё поправимо.
То есть 1-го марта первая минута - это и есть 29-ое февраля. :)
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38385170
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanFr0sT-BrutalЯ бы посоветовал опросить хотя бы нескольких людей, имевших беду родиться в этот злополучный бестолковый день. Потому что примета о поздравлении заранее все же крайне сильна.
Да, microsoft сплоховал тут.
авторКогда отмечать день рождения, если он приходится на 29 февраля, а год – не високосный? Вообще не отмечать – обидно, но дня то нет… так что же делать?

А вот здесь вы заблуждаетесь, что «дня то нет…». Есть. 29 февраля бывает КАЖДЫЙ ГОД! И «выплывает» он ровно на одну минуту: от 00 час.00 мин. до 00 час.01 мин. М-да, маловато, однако, для «отмечания»! Но не печальтесь, всё поправимо.
То есть 1-го марта первая минута - это и есть 29-ое февраля. :)
miwaonline,
как видите есть даже научное подтверждение моего предложения "д.р. 29 февраля не в високосный год праздновать и поздравлять 1-го марта". ;)
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38385179
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS miwaonline,
как видите есть даже научное подтверждение моего предложения "д.р. 29 февраля не в високосный год праздновать и поздравлять 1-го марта". ;)
Поздравляйте когда вам угодно; когда-то человека пригласить в магазин в связи с намечающейся днюхой - до нее, во время, или после - вот в чем вопрос?

Вопрос риторический, отвечать не обязательно.
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38385244
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне вот просто интересно, у кого в свидетельстве записана дата рождения 29 февраля
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38385320
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS,

если бы я родился 29 февраля, то праздновал бы 28-29 февраля, но никак не 1 марта, потому что это уже март, а не февраль, и если "начал 1 марта", то тогда уж и дальше только 1 марта.
Но
" Немецкий профессор Хайнрих Хемме изобрёл «календарь» празднования дня рождения для тех, кто родился 29 февраля. По словам учёного, те, кто родился 29 февраля, могут справлять день рождения каждый год, но день празднования зависит от часа рождения. Те, кто родился в первые часы после полуночи, могут отмечать день рождения 28 февраля. Для тех, кто родился ближе к полуночи 1 марта, лучше отмечать день рождения 1 марта. Те, кто родился в первой половине дня (от 6 утра до 12 дня), первые два года справляют день рождения 28 февраля, а третий год — 1 марта. Для тех, кто родился во второй половине дня (от 12 дня до 6 вечера), график празднования следующий: первый год — 28 февраля, а последующие два — 1 марта. "
http://ru.wikipedia.org/wiki/29_февраля

p.s. "могут справлять ДР каждый год" - спасибо тебе, профессор Хемме!
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38385606
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanЧерновой запрос при наличии правильного рабочего календаря:
Код: sql
1.
2.
3.
4.
select u.* from user u, calendar c
where e.birthday = c.date
and c.day >= current_date+1
and c.day < current_date+2 




Круто?

Тут я конечно маху малость дал. С календарем из этой темы запрос будет выглядеть примерно так:
Код: sql
1.
2.
3.
4.
select u.* from users u, calendar c
where c.val = u.birthday
and c.val >= current_date + 1
and c.val < current_date + 2
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38385614
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И внимание! Вопрос.
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE USERS (
    ID        BIGINT NOT NULL,
    NAME      VARCHAR(128),
    BIRTHDAY  DATE
);
CREATE INDEX USERS_BIRTHDAY ON USERS (BIRTHDAY);


Чем не устраивает такая простота запроса?
Код: sql
1.
2.
3.
select u.* from users u
where u.birthday >= current_date + 1
and u.birthday < current_date + 21



Что я упустил из вопроса и почему появляются способы один сложнее другого? Даже я зачем-то побежал за всеми с календарем. :)
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38385616
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanИ внимание! Вопрос.
Все, перегрелся малость... Дошло, что день рождения каждый год, а дата рождения - одна.
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38385627
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примерно так, только нужно обыграть исходный високосный год:
Код: sql
1.
2.
3.
4.
5.
6.
select u.* from users u, calendar cfrom, calendar cto
where cfrom.val = u.birthday
and cfrom.day_of_month = cto.day_of_month
and cfrom.month_of_year = cto.month_of_year
and cto.val >= current_date + 1
and cto.val < current_date + 21
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38385653
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустамчуть ли не километр там крюка дал,
чтобы объехать это место...Платил по счетчику?
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38385860
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вариант с днем в году, ему все равно на проблему 29-го февраля кмк. :)
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38385920
Евгений Болтик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я делаю это так
(Date_Encode(EXTRACT(YEAR FROM :CURRDATE),
EXTRACT(MONTH FROM Contr_BD),
EXTRACT(DAY FROM Contr_BD)) between cast(:CURRDATE as date) and :CURRDATE+:iDay)

в свое время понадобилось не извлекать, а собирать дату "Date_Encode". (чет не понял до сих пор нет встроенной возможности EXTRACT же есть. И засада если строку кастить такого плана будет ошибка.)

Смысл прост зачем что то сложно было вычислять. Берем текущий год, а месяц и день дня рождения.
При переводе 2001, 2, 29 функция сервера ФБ возвращает нам 01.03.2001. Так что когда нет 29 февраля то празднуем 01 марта и это логично т.к. с начало года именно столько дней. Но на вкус и цвет товарищей нет ;)

хотя дурдом для того кто родился после 29 февраля по идее надо праздновать в день года, а не в день месяца )


function __Date_Encode(Year: Word = 0; Month: Word = 0; Day: Word = 0;
Hour: Word = 0; Min: Word = 0; Sec: Word = 0): PISC_QUAD;
var
tm_date: tm;
begin
with tm_date do begin
tm_year := Year-1900;
tm_mon := Month-1;
tm_mday := Day;
tm_sec := Sec;
tm_min := Min;
tm_hour := Hour;
tm_isdst := 0;
end;
Result := ib_util_malloc(SizeOf(TISC_QUAD));
__isc_encode_date(@tm_date, Result);
end;

{DECLARE EXTERNAL FUNCTION Date_Encode
INTEGER, INTEGER, INTEGER
RETURNS DATE FREE_IT
ENTRY_POINT "fn_Date_Encode" MODULE_NAME "B_UDF2.DLL";}
function fn_Date_Encode(var Year, Month, Day: Cardinal): PISC_QUAD; cdecl; export;
begin
Result := __Date_Encode(Year, Month, Day);
end;
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38386061
Евгений Болтик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanЕще вариант с днем в году, ему все равно на проблему 29-го февраля кмк. :)

Не совсем если 29 в феврале то все что было после съедет в том году в котором будет 28. Приходилось и такое использовать, но тогда надо 2 параметра использовать день в году + дельта для года. Но дельту проставляем только при ориентировании после 29 числа, и логика по году на вкус. дельта либо 0 либо 1 или 0 и -1 зависит от того как от какого года отталкиваешься.

Если сильно на производительность влияет то за основу храним всегда как будто 29 дней есть всегда в году и дельту. А при поиске учитываем что надо найти день равный как будто в году с 29 днями. Так для сравнения надо будет использовать только 1 поле ;) А дельту пригодится когда ни будь для других задач
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38386165
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений БолтикНе совсем если 29 в феврале то все что было после съедет в том году в котором будет 28.
Ошибаешься. Примеры (меняется только дата):
Код: sql
1.
2.
3.
4.
5.
6.
select cfrom.val calendar_from, cto.val calendar_to
from calendar cto, calendar cfrom
where cto.val > '25.02.2013'
and cto.val < cast('25.02.2013' as date) + 21
and cfrom.day_of_year+decode(cfrom.is_leap, 1, decode(extract(month from cfrom.val), 1, 0, 2, 0, -1), 0) = cto.day_of_year
and cfrom.year_of = 1996


26.02.199626.02.201327.02.199627.02.201328.02.199628.02.201329.02.199601.03.201301.03.199601.03.201302.03.199602.03.201303.03.199603.03.201304.03.199604.03.201305.03.199605.03.201306.03.199606.03.201307.03.199607.03.201308.03.199608.03.201309.03.199609.03.201310.03.199610.03.201311.03.199611.03.201312.03.199612.03.201313.03.199613.03.201314.03.199614.03.201315.03.199615.03.201316.03.199616.03.201317.03.199617.03.2013
Код: sql
1.
2.
3.
4.
5.
6.
select cfrom.val calendar_from, cto.val calendar_to
from calendar cto, calendar cfrom
where cto.val > '25.12.2013'
and cto.val < cast('25.12.2013' as date) + 21
and cfrom.day_of_year+decode(cfrom.is_leap, 1, decode(extract(month from cfrom.val), 1, 0, 2, 0, -1), 0) = cto.day_of_year
and cfrom.year_of = 1996


01.01.199601.01.201402.01.199602.01.201403.01.199603.01.201404.01.199604.01.201405.01.199605.01.201406.01.199606.01.201407.01.199607.01.201408.01.199608.01.201409.01.199609.01.201410.01.199610.01.201411.01.199611.01.201412.01.199612.01.201413.01.199613.01.201414.01.199614.01.201426.12.199626.12.201327.12.199627.12.201328.12.199628.12.201329.12.199629.12.201330.12.199630.12.201331.12.199631.12.2013

То есть результативный запрос с пользователями будет выглядеть так:
Код: sql
1.
2.
3.
4.
5.
6.
select cfrom.val calendar_from, cto.val calendar_to, u.name
from calendar cto, calendar cfrom, users u
where cto.val > current_date
and cto.val < current_date + 21
and cfrom.val = u.birthday
and cfrom.day_of_year+decode(cfrom.is_leap, 1, decode(extract(month from cfrom.val), 1, 0, 2, 0, -1), 0) = cto.day_of_year
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38386184
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задачка показалась интересной, ох... В общем, тут теперь обыгрывается и ситуация, когда текущий год тоже високосный. :)
wadman
Код: sql
1.
2.
3.
4.
5.
6.
select cfrom.val calendar_from, cto.val calendar_to, u.name
from calendar cto, calendar cfrom, users u
where cto.val > current_date
and cto.val < current_date + 21
and cfrom.val = u.birthday
and cfrom.day_of_year+decode(cfrom.is_leap, 1, decode(cto.is_leap, 0, decode(extract(month from cfrom.val), 1, 0, 2, 0, -1), 0), 0) = cto.day_of_yearr
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38386336
Евгений Болтик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanЕвгений БолтикНе совсем если 29 в феврале то все что было после съедет в том году в котором будет 28.
Ошибаешься. Примеры (меняется только дата):



Вот и не ошибаюсь т.к. твои примеры говорят о дополнительной логике. Я же говорю о возможности исключить вычисление сравнивать с еще и дельтой. Но поразмышляв немного (пока копировались 20ГБ баз) самый простой вариант это хранить 2 поля дней для вис и не вис годов. Только в этом случае мы избавимся от вычислений ;) В этом случае на 100% будет задействован индекс без всякого перебора данных.
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38386343
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений БолтикВот и не ошибаюсь т.к. твои примеры говорят о дополнительной логике.
Программирование - это в принципе логика. Рабочий вариант выложен 14792661 и твое возражение мне совсем не понятно. Индексы задействованы.
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38386397
Евгений Болтик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanЕвгений БолтикВот и не ошибаюсь т.к. твои примеры говорят о дополнительной логике.
Программирование - это в принципе логика. Рабочий вариант выложен 14792661 и твое возражение мне совсем не понятно. Индексы задействованы.

wadmanЕще вариант с днем в году, ему все равно на проблему 29-го февраля кмк. :)


Я имел ввиду что просто по дню не получится придется логику городить. ;)
И просто намекнул, что либо упростить через дельту или как в последнем посте по 2 полям по ситуации с каким годом сравнивает человек.
Я считаю лучше сразу написать один раз быстро работающий вариант и везде его применять чем тащить логику по всей программе с граблями вдруг чего не дописал :)
Если же разово и неважна производительность. Я привел тоже пример выше как сделал я много...много лет назад и было в то время по барабану там данных мало. Но сейчас я бы сделал это по другому, если бы стояла задача.

PS В тему вник просто захотелось мозги размять после нудной переписки всего механизма репликации. А в спорах мысли новые иногда приходят. К примеру если интересно напиши мне условие как ты проверяешь вхождение одного периода в другой.
с D11 по D12 и с D21 по D22
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38386407
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений БолтикЯ имел ввиду что просто по дню не получится придется логику городить. ;)
Вкратце вердикт: минусов не видишь, просто свой вариант нахваливаешь. :)
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38386436
Евгений Болтик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanЕвгений БолтикЯ имел ввиду что просто по дню не получится придется логику городить. ;)
Вкратце вердикт: минусов не видишь, просто свой вариант нахваливаешь. :)

Здрасте вам не нахваливаю говорю доводы почему сделал бы так. Не мне решать что ты будешь или спросивший внедрять у себя. Для конечного пользователя лишь бы работало. Причем я посмотрел бы на того кто будет разбирать код с километровой конструкцией, что про меня или про тебя он скажет.
Я в спое время был не прав что написал так с "__isc_encode_date". По той причине кто же догадается что системная функция ФБ при 29 февраля вернет 1 марта и поэтому все работает ;) Я просто увидел тему подумал у меня же та же фигня надо перепроверить. Перепроверил перекрестился что все работает и снова к своим делам. Но на заметку взял что надо переписать это место т.к. у одного 2 или 3 клиентов там данные прибывают ежемесячно. Всему свое время
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38386611
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky> Платил по счетчику?

Нет, конечно. :) Это вообще уличный бомбила был IIRC, а не такси по вызову. :)

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38386699
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамНет, конечно. :)Жаль, а то получилось бы зачетное разводилово. :)
Впрочем вероятность действительно "никакая", у нас в городе я вообще в диком виде ни разу такси со счетчиком не видел (имеется в виду новейшая история).
...
Рейтинг: 0 / 0
Как узнать завтрашних именинников?
    #38502110
maksimora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно просто узнать когда в этом году у день рождения)))

year_diff = (EXTRACT (year from :dated)-EXTRACT (year from :birthday));
TEMP = datediff(day, :dated, (dateadd(year,year_diff, birthday)));
...
Рейтинг: 0 / 0
63 сообщений из 63, показаны все 3 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как узнать завтрашних именинников?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]