确定一系列日期中每一天的期间开始日期

时间:2013-09-08 10:55:29

标签: sql sql-server-2008 date datediff date-range

选择日期范围时,我需要确定每个销售日期的具体期间开始日期。这段时间是每两周一次,我所知道的是最近“上一期”的开始日期。我也知道这两周的时间是从2012年9月10日起每两周计算一次。

例如,请在“2013-07-03”和“2013-09-08”之间指定日期范围:

emp|salesdate  |sales |prevperiod |item
123|2013-07-27 |12000 |2013-08-12 |A12
123|2013-07-27 |1800  |2013-08-12 |A17
123|2013-07-28 |400   |2013-08-12 |B03
227|2013-07-27 |1500  |2013-08-12 |A17

我的SQL如何工作以包含销售日期的期间开始日期:

emp|salesdate  |sales |prevperiod |item |salesdateperiodstart
123|2013-07-27 |12000 |2013-08-12 |A12  |2013-07-15
123|2013-07-27 |1800  |2013-08-12 |A17  |2013-07-15
123|2013-07-28 |400   |2013-08-12 |B03  |2013-07-15
123|2013-07-29 |400   |2013-08-12 |B03  |2013-07-29
227|2013-07-27 |1500  |2013-08-12 |A17  |2013-07-15
123|2013-07-28 |400   |2013-08-12 |B03  |2013-07-15

基本上,期限为期两周,自2012年9月10日起运行。鉴于销售日期范围,我需要确定每个销售日的结束期开始日期。

2 个答案:

答案 0 :(得分:1)

基本上你要做的就是

  • 解决方案1:从'2012-09-10'计算整周,然后将其添加到 “2012年9月10日
  • 解决方案2:计算“2012-09-10”整周的剩余时间,然后从salesdate中减去它:

-

select
    emp, salesdate, sales, prevperiod, item,
    dateadd(day, -datediff(day, '20120910', salesdate) % 14, salesdate) as salesdateperiodstart1,
    dateadd(day, (datediff(day, '20120910', salesdate) / 14) * 14, '20120910') as salesdateperiodstart2
from Table1

<强> =&GT; sql fiddle demo

答案 1 :(得分:0)

您的开始日期是2012年9月10日星期一,您的期限会持续14天。因此,下一个时段从2012年9月24日星期一开始,依此类推。

以下小公式将采用任何日期(或日期时间)并将其转换 - 我们可以将其截断 - 转换为报告期间的第一个日期。

 SELECT FROM_DAYS(TO_DAYS(thedate) -MOD(TO_DAYS(thedate) -9, 14))

这有点模糊和令人讨厌,但它基于How to group by week in MySQL?,并经过广泛测试,如年末翻转等。

这是sql-fiddle中的一个小查询,它将通过报告期间开始日期汇总销售。 http://sqlfiddle.com/#!2/5193c/1/0

我不确定你需要什么prevperiod。但是你不需要这个计算。