-1

我有一个有很多员工的表,我们来说'员工'表。这个表格中有一个日期栏。假设这个专栏被称为'InjuryDate'。SQL Server:返回一个表的日期字段满足某些日期条件的所有行

我想选择所有满足以下条件的员工:

  1. InjuryDate是当月内,例如,如果当前的月份是七月,我希望所有的员工说:InjuryDate> = 01/07/2017和InjuryDate < = 2017/3/7。
  2. 受伤日期介于过去一个月的第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的

回答

1

基本上你需要的是摆脱上个月20日的所有记录,直至当月的最后一天。你确实需要或在这里。

DECLARE @end_range DATE= DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0)), 
    @start_rage DATE= DATEADD(m, DATEDIFF(m, 0, DATEADD(m, DATEDIFF(m, 0, GETDATE()), -1)), 19) 

SELECT * 
FROM Employees 
WHERE InjuryDate BETWEEN @start_range AND @end_rage 
+0

为什么你在@start_range中使用秒?有必要吗?还是只考虑了日期而放弃时间就够了?同样在你回答你有切换start_range和end_range,请纠正它。 – Rodri

+0

此外,我的InjuryDate字段只是日期列,我的意思是,它没有时间,时间设置为00:00:00.0。在同一张表中,我有另一个栏目'InjuryTime',其中只包含时间(无日期)。 – Rodri

+0

尽管我的专栏InjuryDate字段仅包含日期,但我认为您的解决方案是可以的。你能确认我吗? – Rodri

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 
+0

@today是31/07时似乎失败/ 2017年,它不会在20日开始。 – Rodri

+0

@Rodri,你是对的,修好了 –

0

。删除我的答案,因为有人认为它是盗取

+1

你是piliverr .. –

+0

@RuslanK。我已经删除了我的答案,因为你觉得它是盗取的,这不是窃取它只是其他方式的代表 –

相关问题