在度假积累报告中获取正确的日期

时间:2013-07-15 18:44:58

标签: sql

我需要指出今天和雇员之间有多少天被雇用(但不关心这一年)。如果一名员工在2012年7月1日雇用,我希望得到一个结果是今天07/15 / 2013-07 / 1/2013,即15天。我不需要2012年的雇用年。

我玩dateadd和datediff但是没有得到正确的结果。

SELECT 
    Co Employee, 
    LastName, 
    FirstName, 
    dateadd(dd,  DATEDIFF(dd,CURRENT_TIMESTAMP,0),HireDate)
FROM dbo.PREH

3 个答案:

答案 0 :(得分:2)

您可以使用模数除法:

SELECT DATEDIFF(DAY,'20120101',GETDATE())%365

缺点是你对闰年的处理与每隔一年一样,你可以用案例逻辑处理。

在您的代码中:

SELECT 
    Co Employee, 
    LastName, 
    FirstName, 
    DATEDIFF(DAY,HireDate,GETDATE())%365 AS DaysThisYear
FROM dbo.PREH

答案 1 :(得分:1)

这可能是一种蛮力,但似乎有效。我们的想法是在招聘人员中添加若干年,然后根据当前日期进行检查。当它更大时,少用一年:

select (case when DATEADD(year, datediff(year, hiredate, getdate()), hiredate) < GETDATE()
             then DATEDIFF(dd, DATEADD(year, datediff(year, hiredate, getdate()), hiredate), getdate())
             else DATEDIFF(dd, DATEADD(year, datediff(year, hiredate, getdate()) - 1, hiredate), getdate())
        end)
from preh;

问题在于datediff() year返回年边界的次数,而不是两个日期之间的年数作为跨度。因此,2012-12-30和2013-01-01之间有一年,2012-01-01和2013-12-31之间有一年。

答案 2 :(得分:0)

听起来你正在放弃这一年,只是作为格式化输出的一部分。但格式化不应影响基础数据。元组的最后一个元素应该是:

datediff(day, HireDate, getdate())

通过这种方式,您可以对数据进行算术运算,并在需要时保存下游格式。