问候StackOverflow向导。
SQL日期时间计算总是给我带来麻烦。我想确定一名员工的雇佣人员是否在该月的最后一个工资日和下个月的第一个工资日之间。 (即他们在雇佣月份得到了薪水。
的已知,:
我似乎无法理解的是如何使用日期(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的值?
答案 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