Member 14700794 Ответов: 2

Sql-запрос для поиска дней рождения и юбилеев


I have a CRON task that needs to extract customers with birthdays in a given date range, from a MySQL DB table. The birthday field is indexed and of type DATE.

I want a query which should trigger on every Monday and extract all the customers who have birthday starting from next monday +10 days thereon.

I'm using below query right now but here I have to manually change the month and date range. Need to automate it

Please assist..


Что я уже пробовал:

DECLARE @Month INT=01
DECLARE @StarDate INT=01
DECLARE @EndDate INT=08

SELECT distinct Outlets.OutletName, Outlets.Locality, Outlets.City, FORMAT(Customers.DateOfBirth, 'dd/MMM')as DOB,DateOfBirth,
 Customers.CustomerName, Customers.Cell_Number, Customers.EmailId, Customers.Gender, Customers.AgeGroup 
FROM Customers WITH (NOLOCK) INNER JOIN CustomerActivities ON Customers.CustomerId=CustomerActivities.CustomerId 
INNER JOIN Outlets ON CustomerActivities.EntityId=Outlets.OutletId 
WHERE Customers.AccountId='wv5wdvf5v46sf2b16f5b16f2b' 
AND  MONTH (DateOfBirth)=@Month
AND  DAY (DateOfBirth) >=@StarDate AND DAY (DateOfBirth) <= @EndDate
Order By DateOfBirth ASC

2 Ответов

Рейтинг:
2

OriginalGriff

Это не будет хорошо работать, даже если его обновить вручную. Если, например, это 270 - е декабря 2019 года, ваш запрос пропустит мою жену, чей день рождения 1 января, потому что он находится в другом месяце.

Вместо проверки месяца и дня создайте два объекта date из DOB и GETDATE, используя YEAR, MONTH и DAY; и используйте DATEDIFF для проверки "в течение 10 дней".


Member 14700794

Вот что, я должен изменить месяц вручную здесь, чтобы получить данные за разные месяцы. Я также попробовал следующий запрос, но он выдает только те данные, где клиент упомянул год рождения как 2019 год.

`Выберите розетки.OutletName, Розетки.Населенный Пункт, Торговые Точки.Город, Клиенты.Дата Рождения, Клиенты.Кодклиента, Клиенты.CustomerName, Клиенты.Cell_Number, Клиентов.EmailId, Клиентов.Пол, Клиенты.Возрастная группа
От клиентов с (NOLOCK) внутренним соединением CustomerActivities на клиентах.CustomerId=CustomerActivities.атрибут CustomerID
Внутренние соединительные розетки на CustomerActivities.EntityId=Выходы.OutletId
Где клиенты.Методами accountid='wv5wdvf5v46sf2b16f5b16f2b'
И DateOfBirth>(GETDATE() + 6) и DateOfBirth<(GETDATE() +15)``

OriginalGriff

Значит, ты просто игнорируешь то, что я говорю?

Вот вам простой стартер:
DECLARE @TODAY INT = datepart(dayofyear, GETDATE())
ВЫБЕРИТЕ ДОБ
от студентов
Где (в случае если datepart(функции dayofyear, дата рождения) в < @сегодня, то функция datepart(dayofyear, то р.) + 365 еще функция datepart(dayofyear, то доб) конец)
Между @TODAY и @TODAY + 9

Рейтинг:
1

Wendelius

Один из способов-использовать CTE для поиска следующего понедельника, а затем использовать результат в предложении where. Рассмотрим следующий пример

WITH NextDays (ActualDate, DayOfWeek) AS (
   -- recursive query for next dates
   SELECT GETDATE(),
          DATEPART(WEEKDAY, GETDATE())
   UNION ALL
   SELECT DATEADD(day, 1, ActualDate),
          DATEPART(WEEKDAY,  DATEADD(day, 1, ActualDate))
   FROM NextDays nd
   WHERE nd.ActualDate < GETDATE() + 8 --limit the query to relevant dates
),
NextMonday (DateForMonday) AS (
   -- query to fetch next Monday
   SELECT TOP 1
          CAST(nd.ActualDate AS date)
   FROM NextDays nd
   WHERE nd.DayOfWeek = 2 -- limit to Mondays only
   ORDER BY nd.ActualDate
)
-- Look for coming birthdays from customer records
SELECT *
FROM Customers c,
     NextMonday nm -- cartesian join used since 
                   -- only one record is returned from NextMonday 
WHERE c.DateOfBirth BETWEEN nm.DateForMonday AND DATEADD(day, 10, nm.DateForMonday)

Примечание:
- вам нужно правильно установить datefirst, смотрите SET DATEFIRST (Transact-SQL) - SQL Server | Microsoft Docs[^]
- также вам нужно изменить запрос, чтобы начать с завтрашнего дня, если этот день не будет включен, в случае, если текущий день будет понедельник.