Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL如何获取两周付款期的日期范围_Sql_Sql Server_Tsql - Fatal编程技术网

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

我有以下种子输入数据:

  • 发薪期开始:12月3日
  • 付款期结束:12月16日
  • 这只是一个公司工资发放的例子

    现在,我只有1个日期输入,例如12/30(与今天一样) 我需要输出当前付款期的日期范围,即:12月17日至12月30日

    同样,如果我输入1月3日,我应该返回2012年12月31日到1月13日

    在T-SQL中有没有捷径,或者我必须做循环


    编辑:总结问题。如果我们知道支付周期何时开始(过去)-我如何计算给定日期的支付周期开始时间?

    您需要一些模运算和

    输出

    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