#sql #sql-server #date #dateadd
#sql #sql-сервер #Дата #dateadd
Вопрос:
в настоящее время пишу запрос для извлечения дат годовщины сотрудника. пока я могу извлекать даты за 5, 10, 15 и 25 лет, но я пытаюсь извлекать даты годовщин только после текущей даты для каждого. есть идеи?
SELECT
HireDate,
DATEADD(year, 5, HireDate) AS '5_Year_Anniversary',
DATEADD(year, 10, HireDate) AS '10_Year_Anniversary',
DATEADD(year, 15, HireDate) AS '15_Year_Anniversary',
DATEADD(year, 25, HireDate) AS '25_Year_Anniversary'
FROM
EMPTABLE;
Комментарии:
1. Microsoft SQL Server 2014
2. Итак, если сотрудник уже проработал там более 5 лет, что должно отображаться в столбце 5_Year_Anniversary?
NULL
?
Ответ №1:
SELECT
HireDate,
case when DATEADD(year, 5, HireDate) >= getdate() --check to see if the anniversary is on or after the current date
then DATEADD(year, 5, HireDate)
else NULL end AS '5_Year_Anniversary' --etc, repeat for your other columns
FROM
EMPTABLE
where DATEADD(year, 25, HireDate) >= getdate() --to filter out employees where all anniversary columns would be NULL
Использование инструкции case, подобной приведенной выше, должно сработать, в зависимости от того, какое значение вы хотите отобразить для этих столбцов, когда у сотрудника уже прошла годовщина. Возможно, вам потребуется cast
/ convert
указать дату вашей годовщины, если вы хотите конкретное значение в этих случаях.
Например:
SELECT
HireDate,
case when DATEADD(year, 5, HireDate) >= getdate() --check to see if the anniversary is on or after the current date
then cast(DATEADD(year, 5, HireDate) as varchar(20))
else 'Already Passed' end AS '5_Year_Anniversary' --etc, repeat for your other columns
FROM
EMPTABLE
where DATEADD(year, 25, HireDate) >= getdate() --to filter out employees where all anniversary columns would be NULL
Комментарии:
1. Большое вам спасибо! это именно то, что мне было нужно! я думал, что это может иметь какое-то отношение к инструкции CASE, но у меня было время с этим
Ответ №2:
Сравните каждую годовщину и покажите, только если дата годовщины после текущей даты.
Оператор SELECT — это решение. Поле вернет значение NULL, если дата прошла.
CREATE TABLE #EMPTABLE
(
HireDate datetime
)
GO
INSERT INTO #EMPTABLE
VALUES
('2018-01-01'),
('2013-01-01'),
('2008-01-01'),
('2003-01-01'),
('1993-01-01')
GO
SELECT
GETDATE() [Current Date],
HireDate,
CASE WHEN ( DATEADD(year, 5, HireDate) > GETDATE() )
THEN DATEADD(year, 5, HireDate)
ELSE NULL
END AS [5_Year_Anniversary],
CASE WHEN ( DATEADD(year, 10, HireDate) > GETDATE() )
THEN DATEADD(year, 10, HireDate)
ELSE NULL
END AS [10_Year_Anniversary],
CASE WHEN ( DATEADD(year, 15, HireDate) > GETDATE() )
THEN DATEADD(year, 15, HireDate)
ELSE NULL
END AS [15_Year_Anniversary],
CASE WHEN ( DATEADD(year, 25, HireDate) > GETDATE() )
THEN DATEADD(year, 25, HireDate)
ELSE NULL
END AS [25_Year_Anniversary]
FROM
#EMPTABLE
GO