TSQL每隔一个星期五从一个"种子"日期

时间:2014-07-16 22:15:35

标签: sql-server tsql datetime datediff dateadd

问候StackOverflow向导。

SQL日期时间计算总是给我带来麻烦。我想确定一名员工的雇佣人员是否在该月的最后一个工资日和下个月的第一个工资日之间。 (即他们在雇佣月份得到了薪水。

的已知,:

  • 我知道我们的发薪日是每隔一个星期五。
  • 我知道1970年1月1日是发薪日,那个日期是最长的 我们有活跃的员工。
  • 我知道每个在职员工的雇用日期(从表中提取)。
  • 我知道(可以计算)雇佣后的第一个月 日期。

我似乎无法理解的是如何使用日期(01/02/1970)与datediff,dateadd,datepart等来确定在有关的雇用日期和下个月的第一天。

在伪代码中,我正在尝试这样做:

declare @seedDate datetime = '01/02/1970' -- Friday - Payday seed date from which to calculate
declare @hireDate datetime = '09/26/2008'  -- this date will actually be pulled from ServiceTotal table
declare @firstOfMonth datetime = DATEADD(MONTH, DATEDIFF(MONTH, 0, @hireDate) + 1, 0) -- the first of the month following @hireDate
declare @priorPayDate datetime  -- calculate the friday payday immediately prior to @firstOfMonth


if @priorPayDate BETWEEN @hireDate AND @firstOfMonth
    begin
        -- do this
    end
else
    begin
        -- do that
    end

使用上面的硬编码@hireDate和@seedDate来确定每隔一个星期五的发薪日,我知道在2008年9月19日有一个发薪日,而在2008年3月10日之前没有另一个发薪日,所以上面的布尔值将为FALSE,我将"做那个"而不是"这样做。"如何确定@priorPayDate的值?

2 个答案:

答案 0 :(得分:2)

在我的所有数据库中,有很多关于日期的事情,我创建了一个包含日期,日期,工作日,月份,周期,日期等的列的表。然后,我使用过程编程语言或一堆手写的sql每天都会填充这个表格,比如1970年到2200年。

我将这张表100%打包并对其进行大量索引。然后,您可以简单地将任何日期加入此表,并使用简单的where子句执行复杂的日期。所以基本上你预先计算一个帮助表。也许在你的情况下你从日期助手表添加一个列与种子列后的星期五。

希望这是有道理的。

答案 1 :(得分:1)

在@seedDate和@firstOfMonth之间的DATEDIFF天数将为您提供总天数,您可以modulus按支付期间(14)的天数来获取从最后一个付款期到@firstOfMonth的天数。当第一个是发薪日(例如下个月)时,您会遇到问题,这需要CASE声明:

DECLARE @priorPayDate DATETIME 
SET @priorPayDate = CASE
                      WHEN DATEDIFF(dd, @seedDate, @firstOfMonth) % 14 = 0 
                        THEN DATEADD(dd, -14, @firstOfMonth)
                      ELSE DATEADD(dd, -(DATEDIFF(dd, @seedDate, @firstOfMonth) % 14), @firstOfMonth)
                    END