T-SQL如何获取两周付款期的日期范围
我有以下种子输入数据:T-SQL如何获取两周付款期的日期范围,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有以下种子输入数据: 发薪期开始:12月3日 付款期结束:12月16日 这只是一个公司工资发放的例子 现在,我只有1个日期输入,例如12/30(与今天一样) 我需要输出当前付款期的日期范围,即:12月17日至12月30日 同样,如果我输入1月3日,我应该返回2012年12月31日到1月13日 在T-SQL中有没有捷径,或者我必须做循环 编辑:总结问题。如果我们知道支付周期何时开始(过去)-我如何计算给定日期的支付周期开始时间?您需要一些模运算和 输出 periodLength daysF
编辑:总结问题。如果我们知道支付周期何时开始(过去)-我如何计算给定日期的支付周期开始时间?您需要一些模运算和 输出
periodLength daysFromFirstPeriod daysIntoPeriod
14 27 13
及
下面的方法行不通吗
DECLARE @StartDate DATETIME
SELECT @StartDate = '2016-05-01 00:00:00.000'
DECLARE @EndDate DATETIME
SELECT @EndDate = '2017-04-01 00:00:00.000'
DECLARE @Dates TABLE(StartDate DATETIME, EndDate DATETIME)
WHILE @StartDate <= @EndDate
BEGIN
INSERT INTO @Dates (StartDate, EndDate)
SELECT @StartDate - 13, @StartDate WHERE DATEPART(WEEK, @StartDate) % 2 = 1 AND DATEPART(WEEKDAY, @StartDate) = 7
SET @StartDate = @StartDate + 1
END
-- Check the dates here... should be every 2 weeks
SELECT * FROM @Dates
DECLARE@StartDate-DATETIME
选择@StartDate='2016-05-01 00:00:00.000'
声明@EndDate-DATETIME
选择@EndDate='2017-04-01 00:00:00.000'
声明@Dates表(StartDate-DATETIME、EndDate-DATETIME)
在@StartDate时,您需要澄清问题。现在还不清楚你想要完成什么。所以,我们可以假设你没有一个包含所有发薪期的预填充表,对吗?@Christoper不,我没有。我有一个种子日期,如果你创建了这样一个表,这个问题的答案会非常简单。目前,答案将涉及一些日期计算,涉及模数14,基准日期为2011年12月3日。如果我创建了表,我不会问这个问题:)但是的,模数14的sugestion是一个好问题。DATEDIFF用于日期和除法。最好是继续循环..请注意,currentPeriodEnd
是独占的(应该是)。嗯,该代码造成的付款期太长了一天。把它改成这样是正确的解决方法吗?顺便说一句,我们使用一个太阳到周六的工作周。set@daysIntoPeriod=@daysfromfromfirstperiod%@periodLength+1
currentPeriodStart currentPeriodEnd
2011-12-17 00:00:00.000 2011-12-31 00:00:00.000
DECLARE @StartDate DATETIME
SELECT @StartDate = '2016-05-01 00:00:00.000'
DECLARE @EndDate DATETIME
SELECT @EndDate = '2017-04-01 00:00:00.000'
DECLARE @Dates TABLE(StartDate DATETIME, EndDate DATETIME)
WHILE @StartDate <= @EndDate
BEGIN
INSERT INTO @Dates (StartDate, EndDate)
SELECT @StartDate - 13, @StartDate WHERE DATEPART(WEEK, @StartDate) % 2 = 1 AND DATEPART(WEEKDAY, @StartDate) = 7
SET @StartDate = @StartDate + 1
END
-- Check the dates here... should be every 2 weeks
SELECT * FROM @Dates