powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как узнать завтрашних именинников?
13 сообщений из 63, страница 3 из 3
Как узнать завтрашних именинников?
    #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
13 сообщений из 63, страница 3 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как узнать завтрашних именинников?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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