我有一张包含很多员工的桌子,让我们说“员工”#39;表。该表具有日期列等。我们假设这个专栏名为“伤害日期”,
。我想选择满足以下条件的所有员工:
考虑到所说的here(考虑到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。
答案 0 :(得分:2)
试试这个:
DECLARE @today date = getdate();
DECLARE @todayDay int = datepart(day, @today);
DECLARE @earlyDate date = dateadd(day, 19, DATEADD(month, DATEDIFF(month, 0, @today) - 1, 0));
DECLARE @nextMonthFirstDayDate date = DATEADD(month, DATEDIFF(month, 0, @today) + 1, 0);
SELECT *
FROM (
VALUES (1, '2017-06-19'),
(2, '2017-06-20'),
(3, '2017-07-19'),
(4, '2017-07-31'),
(5, '2017-08-01')
) AS Employees(Id,InjuryDate)
WHERE InjuryDate >= @earlyDate AND InjuryDate < @nextMonthFirstDayDate;
输出:
Id InjuryDate
----------- ----------
2 2017-06-20
3 2017-07-19
4 2017-07-31
答案 1 :(得分:1)
基本上你需要的是获取从上个月20日到当月最后一天的所有记录。你在这里确实需要。
Object {init: function, showButton: function}
答案 2 :(得分:0)
。当有人感觉到它的窃取时删除我的答案