SQL Server:返回表的所有行,其中日期字段满足某些日期条件

时间:2017-07-28 09:46:19

标签: sql-server sql-server-2008 datetime sql-server-2008-r2 getdate

我有一张包含很多员工的桌子,让我们说“员工”#39;表。该表具有日期列等。我们假设这个专栏名为“伤害日期”,

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

  1. 伤害日期在当月,例如,如果当前月份是7月,我希望所有员工:InjuryDate> = 01/07/2017和InjuryDate< = 31/07/2017。
  2. 伤害日期是在过去一个月的第20天和当月的第一天之间。例如,如果当前月份是7月,我希望所有员工:InjuryDate> = 20/06/2017和InjuryDate< 2017年1月7日。
  3. 考虑到所说的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。

3 个答案:

答案 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)

。当有人感觉到它的窃取时删除我的答案