我有一个有很多员工的表,我们来说'员工'表。这个表格中有一个日期栏。假设这个专栏被称为'InjuryDate'。SQL Server:返回一个表的日期字段满足某些日期条件的所有行
我想选择所有满足以下条件的员工:
- InjuryDate是当月内,例如,如果当前的月份是七月,我希望所有的员工说:InjuryDate> = 01/07/2017和InjuryDate < = 2017/3/7。
- 受伤日期介于过去一个月的第20天到当前月份的第一天之间。例如,如果当前月份是7月份,我希望所有员工:伤害日期> = 20/06/2017和伤害日期< 01/07/2017。
所以考虑说什么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的
为什么你在@start_range中使用秒?有必要吗?还是只考虑了日期而放弃时间就够了?同样在你回答你有切换start_range和end_range,请纠正它。 – Rodri
此外,我的InjuryDate字段只是日期列,我的意思是,它没有时间,时间设置为00:00:00.0。在同一张表中,我有另一个栏目'InjuryTime',其中只包含时间(无日期)。 – Rodri
尽管我的专栏InjuryDate字段仅包含日期,但我认为您的解决方案是可以的。你能确认我吗? – Rodri