powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Получить список именнинников
56 сообщений из 56, показаны все 3 страниц
Получить список именнинников
    #32636653
Z75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Z75
Гость
Есть табличка с полями FIO и D_Rozhd(дд.мм.гг). Нужен запрос выдающий по заданному периоду (например 25.07 - 05.08) список именнинников
...
Рейтинг: 0 / 0
Получить список именнинников
    #32636667
Фотография Stepler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как условие (период) задавать будешь и откудаи куда смореть ?
Stepler (щёлк-щёлк!!)
...
Рейтинг: 0 / 0
Получить список именнинников
    #32636668
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
select * from ... where
date1<=dateserial(year(date),month(D_Rozhd),day(D_Rozhd))
and
dateserial(year(date),month(D_Rozhd),day(D_Rozhd))<=date2
...
Рейтинг: 0 / 0
Получить список именнинников
    #32636709
Z75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Z75
Гость
Владимир Саныч, не работает чавой-то
...
Рейтинг: 0 / 0
Получить список именнинников
    #32636773
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Z75Владимир Саныч, не работает чавой-то
Типа, я должен покаяться, что дал неверное решение?
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637012
Фотография Stepler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так, как не ответил на мой вопрос, я телепатирую, что тебя интересует решение в запросе:
SELECT Tabl.Fio, Left([Tabl]![D_Rozhd],2) AS день, Left(Right([Tabl]![D_Rozhd],7),2) AS месяц
FROM Tabl
WHERE (((Left([Tabl]![D_Rozhd],2))>=Left([начальная дата периода],2)) AND ((Left(Right([Tabl]![D_Rozhd],7),2))>=Right([начальная дата периода],2) And (Left(Right([Tabl]![D_Rozhd],7),2))<=Right([конечная дата периода],2))) OR (((Left([Tabl]![D_Rozhd],2))<=Left([конечная дата периода],2)) AND ((Left(Right([Tabl]![D_Rozhd],7),2))>=Right([начальная дата периода],2) And (Left(Right([Tabl]![D_Rozhd],7),2))<=Right([конечная дата периода],2)))
WITH OWNERACCESS OPTION;

Что-то типа такого... Stepler (щёлк-щёлк!!)
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637024
Z75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Z75
Гость
Да не надо каяться, просто помощь получить хотелось, край как нужно
Спасибо Stepler, щас попробую
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637041
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Z75Да не надо каяться, просто помощь получить хотелось, край как нужно
А как я должен догадаться, что именно не работает?
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637048
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Stepler SELECT Tabl.Fio, Left([Tabl]![D_Rozhd],2) AS день, Left(Right([Tabl]![D_Rozhd],7),2) AS месяц
FROM Tabl
WHERE (((Left([Tabl]![D_Rozhd],2))>=Left([начальная дата периода],2)) AND ((Left(Right([Tabl]![D_Rozhd],7),2))>=Right([начальная дата периода],2) And (Left(Right([Tabl]![D_Rozhd],7),2))<=Right([конечная дата периода],2))) OR (((Left([Tabl]![D_Rozhd],2))<=Left([конечная дата периода],2)) AND ((Left(Right([Tabl]![D_Rozhd],7),2))>=Right([начальная дата периода],2) And (Left(Right([Tabl]![D_Rozhd],7),2))<=Right([конечная дата периода],2)))
WITH OWNERACCESS OPTION;


Как это ты берешь строковые функции от поля типа дата???
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637067
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Санычselect * from ... where
date1<=dateserial(year(date),month(D_Rozhd),day(D_Rozhd))
and
dateserial(year(date),month(D_Rozhd),day(D_Rozhd))<=date2

Может date1 и date2 тоже через DateSerial прогнать?
Для верности :)
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637068
Фотография Stepler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саныч, я знал, я знал, что ты меня будешь критиковать...
но, я надеюсь, этой критикой ты поможешь Z75 ...
Насчет строковых - они же работают. А я не помню как в Аксе (в Экселе знаю) задавать числовой формат даты...
Stepler (щёлк-щёлк!!)
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637098
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
paparomeМожет date1 и date2 тоже через DateSerial прогнать?
Для верности :)
Зачем? Я имел в виду, что они уже даты. Впрочем, может, у Z75 это и не так...

SteplerСаныч, я знал, я знал, что ты меня будешь критиковать...
но, я надеюсь, этой критикой ты поможешь Z75 ...
Если он расскажет, что именно не работает. А не просто "твое решение дурацкое".

SteplerНасчет строковых - они же работают.
Работают с чем? Ты понимаешь, что они работают по-разному в зависимости от того, как Аксесс переводит дату в строку? А переводит он в соответствии с настройками. Поменял настройки - программа перестала работать.

SteplerА я не помню как в Аксе (в Экселе знаю) задавать числовой формат даты...
Что такое числовой формат? Переменная типа дата, что еще нужно?
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637124
Фотография Stepler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Экселе 05/08/04 = 38204 (в числовом формате), не помню - в Аксе енто возможно ???
Stepler (щёлк-щёлк!!)
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637128
Z75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Z75
Гость
Спасиббы всем.
Stepler все заработало только 5 вместо 7 поставил.
Саныч, прошу прошения ежели задел чем, просто уже дошел до кондиции с заморочкой этой
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637145
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Z75Спасиббы всем.
Stepler все заработало только 5 вместо 7 поставил.
Саныч, прошу прошения ежели задел чем, просто уже дошел до кондиции с заморочкой этой
Прочитай то, что я написал Степлеру. Эта программа перестанет работать, если поменять настройки Windows.
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637163
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SteplerВ Экселе 05/08/04 = 38204 (в числовом формате), не помню - в Аксе енто возможно ???
В Аксессе так и есть. Дату можно использовать как число. Никакие функции для преобразования не нужны.
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637184
Фотография Stepler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как тогда переводить из формата в формат? ( т.е. 05/08/04 в 38204 и обратно)
Саныч, убей, плз, мой отдельный топик "Формат даты" - я думал ты мне уже по этому вопросу не ответишь и я решил его завести отдельной темой, верно поспешил...
Stepler (щёлк-щёлк!!)
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637197
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Что значит переводить из формата в формат? Что дано? Какого оно типа - дата или стринг?
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637206
Фотография Stepler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, у меня в табл. датировано в виде 05/08/04 после запроса я хочу видеть как 38204
Что мне нужно сделать ???
Stepler (щёлк-щёлк!!)
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637211
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Еще раз спрашиваю: какого оно типа?
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637228
Фотография Stepler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извини, не корректно написал "датировано". Оно типа - дата
Stepler (щёлк-щёлк!!)
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637230
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Тогда см. мой ответ от 15:33.
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637291
Z75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Z75
Гость
Эт снова я. Вобщем не все так хорошо. Сравнение то идет строчных переменных потому по запросу например: 01.01 - 01.02 найдутся не только все январьские, но я февральские. Вечный вопрос: Что делать?
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637308
Фотография Stepler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Туплю-туплю-туплю (хотя исчо не пятница)
у меня в формате "дата" в таблице столбца "Datt(g)" значения типа 05/08/04.
Запросом хочу сделать отбор дат между 36888 и 38011
Что мне для ентого нуна сделать??
Кстати 1 = 01.01.1900 (воскресенье), а вот 0= 00.01.1900 (суббота) - как это ???
Stepler (щёлк-щёлк!!)
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637324
Фотография Stepler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z75Эт снова я. Вобщем не все так хорошо. Сравнение то идет строчных переменных потому по запросу например: 01.01 - 01.02 найдутся не только все январьские, но я февральские. Вечный вопрос: Что делать?
Я в примере, наверное не доконца прогнал условия отбора (логики)...
Вообще, послушайся Саныча - прими его версию, моя-то быстрее "шаманская".
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637341
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кароче

Для степлера:
Есть функция CLng - если уж так охота из даты получить число и вывести его на печать или использовать в динамическом создании строк

2 Саныч:
Я понял, что переменные уже типа дата
Я хотел сказать, что у нас нет уверенности что эти перетенные содержат данные текущего года, т.е. там год точно тот?

+
Что-то еще не встал вопрос, тоды я поставлю :)

А что делать если нажен список людей с датами рождения (ну напрмер: с 15 декабря по 15 января)?
Так сказать в момент перехода года?
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637345
Фотография Stepler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так вот сдеся как раз и нужно типа 38555....
Stepler (щёлк-щёлк!!)
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637348
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Steplerу меня в формате "дата" в таблице столбца "Datt(g)" значения типа 05/08/04.
Запросом хочу сделать отбор дат между 36888 и 38011
Что мне для ентого нуна сделать??
where твоеполе between 36888 and 38011

SteplerКстати 1 = 01.01.1900 (воскресенье), а вот 0= 00.01.1900 (суббота) - как это ???
00.01.1900 - это 31.12.1899.
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637358
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
paparomeЯ понял, что переменные уже типа дата
Я хотел сказать, что у нас нет уверенности что эти перетенные содержат данные текущего года, т.е. там год точно тот?
Угу. Дошло, согласен.

paparomeА что делать если нажен список людей с датами рождения (ну напрмер: с 15 декабря по 15 января)?
Так сказать в момент перехода года?
Тогда вместо and пишем or. :^)
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637360
Фотография Stepler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Саныч Никакие функции для преобразования не нужны .

paparomeКароче

Для степлера:
Есть функция CLng ...
paparome - спасибо, сделал - работает
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637364
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Без CLng тоже должно. На что спорим?
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637380
Фотография Stepler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SteplerКстати 1 = 01.01.1900 (воскресенье), а вот 0= 00.01.1900 (суббота) - как это ???
00.01.1900 - это 31.12.1899.[/quot]
У меня ПК выдает 00.01.1900 !!!! а Все рарьше воспринимает как текст...
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637383
Фотография Stepler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир СанычБез CLng тоже должно. На что спорим?
Саныч, я не знаю- могет настройки , но у меня не работает...
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637402
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир СанычБез CLng тоже должно. На что спорим?
Саныч - не надо
Если динамически прикручивать даты к запросу, то просто так работать не будет (да что я тебе объясняю - ты и сам в курсе )
Код: plaintext
strSQL = "Select * From tbl1 Where date_fld between " & date1 & " and " & date2 & "
Код: plaintext
strSQL = "Select * From tbl1 Where date_fld between " & clng(date1) & " and " & clng(date2) & "
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637424
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
paparomeА что делать если нажен список людей с датами рождения (ну напрмер: с 15 декабря по 15 января)?
Так сказать в момент перехода года?

select * from ... where
(date1<=dateserial(year(date1),month(D_Rozhd),day(D_Rozhd))
and
dateserial(year(date1),month(D_Rozhd),day(D_Rozhd))<=date2)
or
(date1<=dateserial(year(date2),month(D_Rozhd),day(D_Rozhd))
and
dateserial(year(date2),month(D_Rozhd),day(D_Rozhd))<=date2)
or
((year(date1)+1)<year(date2))
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637430
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или, соответственно:

select * from ... where
(dateserial(year(date1),month(D_Rozhd),day(D_Rozhd)) between date1 and date2)
or
(dateserial(year(date2),month(D_Rozhd),day(D_Rozhd)) between date1 and date2)
or
((year(date1)+1)<year(date2))
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637431
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Geo

СУПЕР
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637441
Z75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Z75
Гость
To Geo
А в каком формате date1, date2 задавать. У меня в D_Rozhd например 01.01.80?
Как мне их задать 04.01.01 или 040101 или еще как?
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637448
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Я проспорил про CLng. :^)
Но про Left - им все равно пользоваться низя.
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637473
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Z75
В формате даты. D_Rozhd - это поле типа дата? Так и оставь его имя как есть, не преобразовывай ничего.
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637930
Z75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Z75
Гость
Можете меня распнуть, но я так и не догнал как задать date1 и date2?
дд.мм.гг или ддммгг или гг.мм.дд. или как? Подмогните, плз
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637952
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z75Можете меня распнуть, но я так и не догнал как задать date1 и date2?
дд.мм.гг или ддммгг или гг.мм.дд. или как? Подмогните, плз
Например, так:
в модуле
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
public date1 as date
public date2 as date

public function GetDate1() as date
  getdate1=date1
end function

public function GetDate2() as date
  getdate2=date2
end function

в запросе вместо date1/Date2 писать GetDate1()/GetDate2()
Перед выполнением запроса заполнить переменные нужными значениями.
...
Рейтинг: 0 / 0
Получить список именнинников
    #32637967
Z75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Z75
Гость
Спасибо, GEO. Заработало!
...
Рейтинг: 0 / 0
Получить список именнинников
    #32638309
Фотография Stepler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geoили, соответственно:

select * from ... where
(dateserial(year(date1),month(D_Rozhd),day(D_Rozhd)) between date1 and date2)
or
(dateserial(year(date2),month(D_Rozhd),day(D_Rozhd)) between date1 and date2)
or
((year(date1)+1)<year(date2))
Попробовал...
И не понял, что значение месяца - несущественно ???
В таком виде определяет только дату дня, а не месяца...

Могет я и не прав, но у меня вот в таком виде "проходит":
SELECT tabl.D_Rozhd, tabl.Fio
FROM tabl
WHERE (((CLng(DateAdd("yyyy",Format(Date(),"yyyy")-Format(tabl!D_Rozhd,"yyyy"),tabl!D_Rozhd)-37987))>=CLng(DateAdd("yyyy",Format(Date(),"yyyy")-Format([начало],"yyyy"),[начало])-37987) And (CLng(DateAdd("yyyy",Format(Date(),"yyyy")-Format(tabl!D_Rozhd,"yyyy"),tabl!D_Rozhd)-37987))<=CLng(DateAdd("yyyy",Format(Date(),"yyyy")-Format([конец],"yyyy"),[конец])-37987)))
WITH OWNERACCESS OPTION;
...
Рейтинг: 0 / 0
Получить список именнинников
    #32638354
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оригинально...
Вариант ВС, усложненный до неузнаваемости.
...
Рейтинг: 0 / 0
Получить список именнинников
    #32638484
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Z75Можете меня распнуть, но я так и не догнал как задать date1 и date2?
дд.мм.гг или ддммгг или гг.мм.дд. или как? Подмогните, плз
Не распнуть, а распять. Или расшесть. Их нельзя задавать ни так, ни так. Потому что это все варианты для типа String. А надо задавать как тип Date.
...
Рейтинг: 0 / 0
Получить список именнинников
    #32781133
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geoили, соответственно:

select * from ... where
(dateserial(year(date1),month(D_Rozhd),day(D_Rozhd)) between date1 and date2)
or
(dateserial(year(date2),month(D_Rozhd),day(D_Rozhd)) between date1 and date2)
or
((year(date1)+1)<year(date2))

было - значит было.
вот зачам тут ((year(date1)+1)<year(date2))
пока не понял.

на нулл тоже неплохо бы проверять.

Ну, а "мой" вариант превращается в

(
([Дата рождения] Is Not Null) And
DateAdd('yyyy',Round(DateDiff('m',[Дата рождения],[tdate])/12,0) ,[D_Rozhd]) between [StartDate] AND [LastDate])
)

:)
...
Рейтинг: 0 / 0
Получить список именнинников
    #32781134
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да. глупость моя неистощима...
виноватс...
...
Рейтинг: 0 / 0
Получить список именнинников
    #32781137
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
типа - вот это я сказать собирался...
Код: plaintext
1.
2.
3.
(
([D_Rozhd] Is Not Null) And
DateAdd('yyyy',Round(DateDiff('m',[D_Rozhd],[StartDate])/ 12 , 0 ) ,[D_Rozhd]) between [StartDate] AND [LastDate])
)

(с выражением лица)
...
Рейтинг: 0 / 0
Получить список именнинников
    #32781160
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще раз про глупость.

У предложенного мной варианта "глубина проницания" (разность между границами интервала) - полгода. Дальше не работает.

исправления:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
(
([D_Rozhd] Is Not Null) And
(
DateAdd('yyyy',Round((DateDiff('m',[D_Rozhd],[StartDate])/ 12 ), 0 ),[Дата рождения]) between  [StartDate] AND [LastDate]
OR
 DateAdd('yyyy',Round((DateDiff('m',[D_Rozhd],[LastDate])/ 12 ), 0 ),[Дата рождения]) between  [StartDate] AND [LastDate]
)
)

или эквивалентное


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
(
([D_Rozhd] Is Not Null) And

(
DateAdd('yyyy',Round((DateDiff('m',[D_Rozhd],[StartDate])/ 12 ), 0 ),[Дата рождения]) >= [StartDate] 
OR
 DateAdd('yyyy',Round((DateDiff('m',[D_Rozhd],[LastDate])/ 12 ), 0 ),[Дата рождения]) <= [LastDate]
)
)

по существу неотличимы от варианта Geo, а потому - неинтересны.

так што - я ушпокоилси...

(с выражением лица)
...
Рейтинг: 0 / 0
Получить список именнинников
    #32781183
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в предыдущем посте второй вариант назван неверно - он не "эквивалентый",
а не рабочий...

из прочих "эквивалентных перезаписей" глаз пока остановился вот на такой
(дружит с Null-ом в значениях полей)


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
(
DateAdd('yyyy', 1 ,[StartDate])<[LastDate]
OR
(

DatePart('y',[D_Rozhd]) 
 between  DatePart('y',[StartDate]) AND DatePart('y',[LastDate]) +  DateDiff('y',DateSerial(Year([StartDate]), 1 , 1 ),DateSerial(Year([LastDate]), 1 , 1 ))

OR

DatePart('y',[D_Rozhd]) + DateDiff('y',DateSerial(year([Startdate]), 1 , 1 ),DateSerial(Year([LastDate]), 1 , 1 ))   
 between  DatePart('y',[StartDate]) AND DatePart('y',[LastDate]) +  DateDiff('y',DateSerial(Year([Startdate]), 1 , 1 ),DateSerial(Year([LastDate]), 1 , 1 ))
)
)

первое условие, при заказе интервала больше года, просто не допустит
вычисления оставшейся части и выдаст все записи.
Оставшаяся часть сработает на глубине в год. Правая сторона внутреннего OR
сработает при заказе интервала с переходом через год, для дней,
попадающих в "новый" год.



(с выражением лица)
...
Рейтинг: 0 / 0
Получить список именнинников
    #32781414
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уж очень хотелось получить вариант, по возможности,
переносимый под SQL Server с минимальным количеством переделок.

Получилось вот что
Заводится вспомогательная таблица с целыми числами от -366 до +366
пусть таблица DayNums, поле - NumDay

Запрос на выдачу списка дней рождений в заказанном диапазоне превращается в такой

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
PARAMETERS StartDate DateTime, LastDate DateTime;
SELECT Таблица1.[Дата рождения]
FROM Таблица1 INNER JOIN  (
SELECT TOP  1   abs( DayNums.NumDay) as ABSValue , DayNums.NumDay as ShiftValue, 
DATEPART('y',DATEADD('y',[DayNums].[NumDay],[StartDate])) AS LeftBound, 
DATEPART('y',DATEADD('y',[DayNums].[NumDay],[LastDate])) AS RightBound
FROM DayNums
WHERE DATEPART('y',DATEADD('y',[DayNums].[NumDay],[StartDate])) <   DATEPART('y',DATEADD('y',[DayNums].[NumDay],[LastDate]))
ORDER BY abs( DayNums.NumDay)
) as Calc ON (DateAdd('yyyy', 1 ,[StartDate])<[LastDate] OR
 ( DatePart('y',DateAdd('y',Calc.ShiftValue, Таблица1.[Дата рождения])) BETWEEN Calc.LeftBound AND Calc.RightBound )) 



(с выражением лица)
...
Рейтинг: 0 / 0
Получить список именнинников
    #32782583
Iskander68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если вот так:

PARAMETERS [начальная дата] DateTime, [конечная дата] DateTime;
SELECT surname & ' ' & firstname AS ФИО, DateSerial(Year( [начальная
дата]),Month(datebirth),Day(datebirth)) AS ДеньРождения, Main.DateBirth,
[начальная дата], [конечная дата]
FROM Staff
WHERE datebirth is not null and DateSerial(Year( [начальная
дата]),Month(datebirth),Day(datebirth)) between[начальная дата] and
[конечная дата]
UNION SELECT surname & ' ' & firstname AS ФИО, DateSerial(Year( [конечная
дата]),Month(datebirth),Day(datebirth)) AS ДеньРождения, Main.DateBirth,
[начальная дата], [конечная дата]
FROM Staff
WHERE datebirth is not null and DateSerial(Year( [конечная
дата]),Month(datebirth),Day(datebirth)) between [начальная дата] and
[конечная дата]
ORDER BY ДеньРождения, ФИО;

Для особо вьедливых можно добавить условие, чтобы
DateSerial(Year( [начальная дата]),Month(datebirth),Day(datebirth)) и
DateSerial(Year( [конечная дата]),Month(datebirth),Day(datebirth)) не были
бы меньше DateBirth.
--
Regards
Alexander Artamonov

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Получить список именнинников
    #32782779
Гео
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это преобразуется к

SELECT ...
FROM ...
WHERE datebirth is not null and DateSerial(Year( [начальная
дата]),Month(datebirth),Day(datebirth)) between[начальная дата] and
[конечная дата]
OR
WHERE datebirth is not null and DateSerial(Year( [конечная
дата]),Month(datebirth),Day(datebirth)) between [начальная дата] and
[конечная дата]
...

, что почти =

select * from ... where
(dateserial(year(date1),month(D_Rozhd),day(D_Rozhd)) between date1 and date2)
or
(dateserial(year(date2),month(D_Rozhd),day(D_Rozhd)) between date1 and date2)
or
((year(date1)+1)<year(date2))

Работать будет, и правильно. По скорости ничего не могу сказать.
...
Рейтинг: 0 / 0
Получить список именнинников
    #32782781
Гео
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, о преобразовании уже сказал Ривкин Дмитрий в соседнем топике.
...
Рейтинг: 0 / 0
Получить список именнинников
    #32782813
Iskander68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, спасибо.

--
Regards
Alexander Artamonov

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
56 сообщений из 56, показаны все 3 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Получить список именнинников
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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