У меня есть таблица с большим количеством сотрудников, скажем, таблица «Сотрудники». В этой таблице есть столбец даты среди других. Допустим, этот столбец называется «Дата травмы».
Я хотел бы выбрать всех сотрудников, которые удовлетворяют следующим условиям:
- InjuryDate находится в текущем месяце, например, если текущий месяц — июль, я хочу, чтобы все сотрудники: InjuryDate >= 07.01.2017 и InjuryDate ‹= 31.07.2017.
- InjuryDate находится между 20-м днем прошлого месяца и первым днем текущего месяца. Например, если текущий месяц — июль, мне нужны все сотрудники, которые: InjuryDate >= 20.06.2017 и InjuryDate ‹ 07.01.2017.
Итак, учтите, что сказано здесь (принимая во внимание, что SQL Server может использовать индекс для столбца, если это необходимо), я сделал следующий запрос:
DECLARE @today datetime = getdate()
DECLARE @Day int = 20
DECLARE @Month int = MONTH(dateadd(month, -1, @today))
DECLARE @Year int = YEAR(dateadd(month, -1, @today))
DECLARE @EarlyDate datetime = cast(cast(@Year*10000 + @Month*100 + @Day as varchar(255)) as date)
SELECT *
FROM Employees
WHERE (
-- Condition 1
InjuryDate >= cast(@today - day(@today) + 1 as date)
AND
InjuryDate < dateadd(month, 1, cast(@today - day(@today) + 1 as date) )
)
OR
(
-- Condition 2
InjuryDate >= @EarlyDate
AND
InjuryDate < cast(@today - day(@today) + 1 as date)
)
Это правильно, или есть другой лучший способ сделать это?
Я использую SQL Server 2008.