【问题标题】:TSQL Determine every other Friday from a "seed" dateTSQL 从“种子”日期开始每隔一个星期五确定一次
【发布时间】:2014-09-07 15:06:03
【问题描述】:

问候 StackOverflow 向导。

SQL 日期时间计算总是给我带来麻烦。我正在尝试确定员工的受雇日期是否介于该月的最后一个发薪日和下个月的第一天之间。 (即,他们是否在雇佣月份获得了薪水。

已知:

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

我似乎无法理解的是如何将种子日期 (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 的值?

【问题讨论】:

    标签: sql-server tsql datetime datediff dateadd


    【解决方案1】:

    在我所有与日期有关的数据库中,我创建了一个表格,其中包含日期、日期、工作日、月份、weeknr、月份日期等列。然后我使用过程编程语言或一堆在 1970 年到 2200 年的大范围内,每天用手写 sql 填充此表。

    我 100% 打包此表并对其进行大量索引。然后,您可以简单地将任何日期加入此表,并使用简单的 where 子句执行复杂的日期内容。所以基本上你预先计算了一个辅助表。也许在您的情况下,您使用 friday since seed 列将列添加到日期助手表中。

    希望这是有道理的。

    【讨论】:

    • 这就是我的想法,尽管我真的不想那样做。如果我无法使 stubaker 的建议对我有用,我仍然可能不得不这样做。感谢您的慷慨参与!
    【解决方案2】:

    在您的@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
    

    【讨论】:

    • stubaker,效果很好。我无法充分表达我的感激之情,因为您将注意力集中在让我难过的事情上。
    猜你喜欢
    • 2013-09-13
    • 1970-01-01
    • 2015-11-22
    • 2023-03-30
    • 1970-01-01
    • 2020-03-24
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多