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


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