SQL-запросы для отображения лиц, которым исполнился 21 год три месяца назад, и людей, которым исполнилось 21 год через шесть месяцев с даты запуска плюс один месяц - PullRequest
0 голосов
/ 07 июня 2019

Я должен разработать 2 ежемесячных отчета каждый со следующим:

  • Лица, которым исполнился 21 год назад со дня запуска отчета
  • Лица, которым в отчетный период исполнится 21 год с даты отчета, но прибавят месяц.

Для человека, которому исполнился 21 месяц назад со дня запуска отчета, я попытался, но это не сработало:

DATEDIFF(YEAR,BIRTHDAY, DATEADD(Month,-6,GETDATE())) = 21

Для лиц, которым исполняется 21 год через шесть месяцев, но добавляется месяц

DATEDIFF(YEAR,BIRTHDAY, DATEADD(Month,1,DATEADD(Month,6,GETDATE()))) = 21

1 Ответ

1 голос
/ 07 июня 2019

Этот ответ для SQL Server.

Я создал несколько тестовых данных и не вижу, что не будет работать.

Хороший способ проверить это на своем компьютере - создать временную таблицу с некоторыми примерами данных и посмотреть, как выглядит результат. Это тест, который я использовал;

IF OBJECT_ID('tempdb..#People') IS NOT NULL DROP TABLE #People
CREATE TABLE #People (Name varchar(20), Birthdate datetime)
INSERT INTO #People (Name, Birthdate)
VALUES
 ('Alice','1997-12-07')
,('Brenda','1998-01-01')
,('Charlie','2001-12-25')
,('Deborah','1997-07-01')
,('Erik','1985-01-01')


SELECT
    *
    ,DATEADD(Month,-6,GETDATE()) AS SixMonthsAgoDate
    ,DATEDIFF(YEAR, Birthdate, DATEADD(Month,-6,GETDATE())) AgeSixMonthsAgo
    ,DATEADD(Month,1,DATEADD(Month,6,GETDATE())) SevenMonthsFutureDate
    ,DATEDIFF(YEAR, Birthdate, DATEADD(Month,7,GETDATE())) AgeSevenMonthsFuture
FROM #People

Последние 4 расчета являются вашими (кроме последнего, вы добавляли 6 месяцев, а затем добавляли 1 месяц отдельно, я изменил его просто на добавление 7 месяцев).

Вывод выглядит так:

Name    Birthdate               SixMonthsAgoDate        AgeSixMonthsAgo SevenMonthsFutureDate       AgeSevenMonthsFuture
Alice   1997-12-07 00:00:00.000 2018-12-07 14:38:22.370 21              2020-01-07 14:38:22.370     23
Brenda  1998-01-01 00:00:00.000 2018-12-07 14:38:22.370 20              2020-01-07 14:38:22.370     22
Charlie 2001-12-25 00:00:00.000 2018-12-07 14:38:22.370 17              2020-01-07 14:38:22.370     19
Deborah 1997-07-01 00:00:00.000 2018-12-07 14:38:22.370 21              2020-01-07 14:38:22.370     23
Erik    1985-01-01 00:00:00.000 2018-12-07 14:38:22.370 33              2020-01-07 14:38:22.370     35

Что прекрасно работает для того, что вы пытаетесь сделать.

Не стесняйтесь пробовать приведенный выше запрос, используя ваши фактические данные, чтобы вы могли отладить его самостоятельно. Мы не можем многое сделать здесь при переполнении стека без выборочных данных и ожидаемого результата.

Если вы пытаетесь решить это для месяца рождения людей, то вам лучше всего делать это в месяцах, а не в годах. Как то так;

SELECT
    *
    ,DATEADD(Month,-6,GETDATE()) AS SixMonthsAgoDate
    ,DATEDIFF(MONTH, Birthdate, DATEADD(Month,-6,GETDATE())) AgeSixMonthsAgo_Months
    ,DATEADD(Month,1,DATEADD(Month,6,GETDATE())) SevenMonthsFutureDate
    ,DATEDIFF(MONTH, Birthdate, DATEADD(Month,7,GETDATE())) AgeSevenMonthsFuture_Months
FROM #People

И тогда ваши предложения where будут выглядеть так:

DATEDIFF(MONTH, Birthdate, DATEADD(Month,-6,GETDATE())) = (21 * 12)

и

DATEDIFF(MONTH, Birthdate, DATEADD(Month,7,GETDATE())) = (21 * 12)

или даже упрощенный далее к этому;

DATEDIFF(MONTH, Birthdate, GETDATE()) = (21 * 12) - 6

DATEDIFF(MONTH, Birthdate, GETDATE()) = (21 * 12) + 7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...