如何查找天,周或日月或天的间隔?

时间:2015-10-08 06:39:37

标签: sql-server sql-server-2008 tsql date stored-procedures

我必须根据用户提供输入的开始日期和结束日期之间的间隔来查找月份,日期或月份,周或周日或仅天数的总数。

如果两个日期之间的间隔不超过30,那么输出应该只有几天

例如 - StartDate - 7月1日EndDate-7月24日

Time_Type                  StartDate                          EndDate
   Day                      1 July                            24 July

间隔时间超过30天但不到90天,而且输出应仅在几天和几周内,我的周从星期一开始到周日结束

例如 - StartDate - 2015年7月1日EndDate-23 2015年9月

Time_Type                      StartDate                              EndDate
   Day                          1-07-2015                            5-07-2015
  Week                         Week2(july)                    Week3(September)
   Day                          21-09-2015                        23-09-2015

`Interval is more than 90 Days than` output should be in days and months

例如 - StartDate - 2015年4月22日EndDate-8 2015年12月

Time_Type                    StartDate                                EndDate
   Day                       22-04-2015                          30-04-2015
  Week                        May2015                             November 2015
   Day                       01-12-2015                          08-12-2015

这里的周数可能是一周一年的明显,如第2周(7月)将是26周。

2 个答案:

答案 0 :(得分:2)

您可以使用DATEDIFF(D,StartDate,EndDate)查看两个日期之间的天数。

然后您可以使用CASE WHEN X < 120 THEN 'A' WHEN X < 90 THEN 'B' ELSE 'C' END选择格式样式。

我认为这就是你想要做的格式化

SELECT DATENAME(DAY,GETDATE()) + ' ' + DATENAME(MONTH,GETDATE())

SELECT 'Week ' + CAST(DATEPART(WEEK,GETDATE()) - DATEPART(WEEK,DATENAME(YEAR,GETDATE()) + '/' + DATENAME(MONTH,GETDATE()) + '/' + '1') AS NVARCHAR)+ ' ' + DATENAME(MONTH,GETDATE())

SELECT DATENAME(MONTH,GETDATE()) + ' ' + DATENAME(YEAR,GETDATE())

但我不确定你在使用WEEK做什么?任何月份的第1周都没有这样的事情,因为月份并不总是从周一开始#&lt;

我所做的就是计算一年中的一周(日期)并减去一个月中第一天(该日期)的一周。

您需要使用我拥有GETDATE()的日期。所以在你的情况下,你这样做一次使用StartDate,再次使用EndDate。如果要多次使用它,您可能希望将此格式代码转换为函数。

我希望你能把这些放在一起,我可以为你做,但我相信你可以用你想要的方式得到你想要的东西。如果没有,请告诉我,我会发布更多详情。

答案 1 :(得分:0)

这将计算时间间隔大于30的整周或数月,否则只计算天数:

DECLARE @StartDate date = '2015-07-01'
DECLARE @EndDate   date = '2015-12-24'

SELECT 
  CASE timetype
  WHEN 'days'
  THEN null
  WHEN 'weeks'
  THEN
    datediff(d, @StartDate, @EndDate) - 
    datediff(week, dateadd(d, datediff(d, 1, @StartDate) / 7 * 7, 7), 
    dateadd(d, datediff(d, -1, @EndDate) / 7 * 7, 0)) * 7
  WHEN 'months'
  THEN
    datediff(d, @StartDate, dateadd(m, datediff(m, 0, @StartDate)+ 1, 0)) +
    datediff(d, dateadd(m, datediff(m, 0, @EndDate), 0), @EndDate) + 1
  END as remainingdays,
  CASE timetype 
  WHEN 'days'
  THEN datediff(d, @StartDate, @EndDate)
  WHEN 'weeks'
  THEN weeks
  WHEN 'months'
  THEN
    datediff(m, dateadd(d, -1, @StartDate), dateadd(d, 1, @EndDate)) - 1
  END as diff,
  timetype
  FROM 
    (SELECT CASE WHEN datediff(d, @StartDate, @EndDate) between 0 and 30 THEN 'days'
         WHEN datediff(d, @StartDate, @EndDate) < 90 THEN 'weeks'
         WHEN datediff(d, @StartDate, @EndDate) >= 90 THEN 'months' END timetype,
         datediff(week, dateadd(d, datediff(d, 1, @StartDate) / 7 * 7, 7), 
         dateadd(d, datediff(d, -1, @EndDate) / 7 * 7, 0)) weeks
     ) x