【问题标题】:How to find interval in days, week or days and month or days?如何找到天、周或天和月或天的间隔?
【发布时间】:2016-01-05 15:16:38
【问题描述】:

我必须找到总数。月、日或月、周或周、日或仅几天,基于用户提供输入的开始日期和结束日期之间的间隔。

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

例如- StartDate - 1 July EndDate-24 July

Time_Type                  StartDate                          EndDate
   Day                      1 July                            24 July

间隔大于 30 天但小于 90 天,输出应仅以天和周为单位,我的一周从星期一开始,到星期日结束

例如- StartDate - 1 July 2015 EndDate- 23 September 2015

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 – 22 April 2015 EndDate - 8 December 2015

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 周。

【问题讨论】:

  • @JulienVavasseur 让这个问题变得复杂的并不是日期差异
  • 一旦你知道天数的差异,使用 CASE
  • @JulienVavasseur 听起来您已经有了 DATEDIFF 和 CASE 的答案。我很想看到它发布
  • 你如何定义一个月? startdate 2015-01-29 enddate 2015-02-28 会是一个月吗?与周相同的问题,周三第 1 周,周二第 2 周可能是 2 周,因为两个周都包括在内,1 周四舍五入或 0 周,因为没有整周
  • 如果您提供示例数据(因为它存在于您的一个或多个表中),然后仅基于该示例提供预期结果,那会简单得多。

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


【解决方案1】:

您可以使用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 做什么?没有任何月份的第一周这样的事情,因为月份并不总是从“星期一”开始

我所做的是计算出一年中的一周(对于日期)并减去一年中的一周作为一个月的第一天(对于日期)。

您需要使用我有GETDATE() 的日期。因此,在您的情况下,您使用 StartDate 一次,然后使用 EndDate 再次执行此操作。如果您要多次使用此格式代码,您可能希望将其转换为函数。

我希望你能把这一切放在一起,我可以为你做,但我相信你可以通过这个答案中的内容得到你想要的东西。如果没有,请告诉我,我会发布更多详细信息。

【讨论】:

  • 我有一个开始日期和结束日期,所以如何使用这两个日期来代替 getdate()
  • 你不要同时使用。您一次使用一个。我会更新我的答案以帮助解释。
  • 是的,好的..这肯定会有所帮助
  • 我已经进行了一些更新,但我现在必须离开,如果到我回来时您仍然没有答案,那么我一定会提供更好的答案。我建议您尝试上述想法,我相信您会全力以赴。
  • 是的,好的...但是为什么我没有看到变化?
【解决方案2】:

当时间间隔大于 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

【讨论】:

  • 但是对于您的日期,剩下的日子只会给第 5 个月的任何内容:(
  • @AdityaShrivastava 现在应该已经修复了,请不要忘记接受答案
  • 抱歉,但请查看我的输出...我需要每个日期维度的开始和结束日期,或者如果是月份...您的代码也在同一行中给出月份的输出和一天..我已经发布了我的输出,请以这种方式进行
  • 您是否在认真抱怨结果集是 1 行而不是 3 行?我给了你所有的代码来以非常高的复杂性计算一切。剩下的挑战交给你。
  • 好吧,让我们离开,但主要是我想要开始日期和结束日期我已经把它放在我的问题的输出中这个东西我已经想出了如何得到剩余的一天,但我想要而是确切的日期。这就是我需要的
猜你喜欢
  • 2020-04-04
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多