Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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
Sql 计算整个月的结束日期,而不是截止到实际的结束日期?我倾向于避免递归CTE,因为它们不能很好地扩展性能。我已经更新了代码。现在应该采取适当的结束日期 SELECT [BookingNum] ,[StartDate] ,[EndDate] ,[Lo_Sql_Sql Server_Datediff - Fatal编程技术网

Sql 计算整个月的结束日期,而不是截止到实际的结束日期?我倾向于避免递归CTE,因为它们不能很好地扩展性能。我已经更新了代码。现在应该采取适当的结束日期 SELECT [BookingNum] ,[StartDate] ,[EndDate] ,[Lo

Sql 计算整个月的结束日期,而不是截止到实际的结束日期?我倾向于避免递归CTE,因为它们不能很好地扩展性能。我已经更新了代码。现在应该采取适当的结束日期 SELECT [BookingNum] ,[StartDate] ,[EndDate] ,[Lo,sql,sql-server,datediff,Sql,Sql Server,Datediff,计算整个月的结束日期,而不是截止到实际的结束日期?我倾向于避免递归CTE,因为它们不能很好地扩展性能。我已经更新了代码。现在应该采取适当的结束日期 SELECT [BookingNum] ,[StartDate] ,[EndDate] ,[Location] ,DATEPART(m,startdate) AS [Month] ,DATEDIFF(MINUTE,StartDate,EndDate) AS [Minutes] FROM [Test].[dbo].[Booking]


计算整个月的结束日期,而不是截止到实际的结束日期?我倾向于避免递归CTE,因为它们不能很好地扩展性能。我已经更新了代码。现在应该采取适当的结束日期
SELECT [BookingNum]
  ,[StartDate]
  ,[EndDate]
  ,[Location]
  ,DATEPART(m,startdate) AS [Month]
  ,DATEDIFF(MINUTE,StartDate,EndDate) AS [Minutes]
FROM [Test].[dbo].[Booking]


BookingNum  StartDate                  EndDate        Location Month Minutes
   1    2019-02-05 12:54:00.000 2019-02-08 15:00:00.000 Area 1  2   4446
   2    2019-05-02 10:41:00.000 2019-05-10 12:39:00.000 Area 2  5   11638
   3    2019-06-01 10:30:00.000 2019-06-04 09:25:00.000 Area 3  6   4255
   4    2019-02-02 09:41:00.000 2019-04-20 11:54:00.000 Area 1  2   111013
   5    2019-03-29 19:09:00.000 2019-04-02 10:41:00.000 Area 3  3   5252
StartDate                  EndDate            Location Month Minutes
2019-02-02 09:41:00.000 2019-02-28 23:59:00.000 Area 1  2   38298
2019-03-01 00:00:00.000 2019-03-31 23:59:00.000 Area 1  3   44639
2019-04-01 00:00:00.000 2019-04-20 23:59:00.000 Area 1  4   28074
DECLARE @tbl TABLE (bookingnum INT, sd DATETIME, ed DATETIME)
INSERT INTO @tbl VALUES 
(1, '2/5/2019 12:54 PM', '2/8/2019 3:00 PM'),
(2, '5/2/2019 10:41 AM', '5/10/2019 12:39 PM'),
(3, '6/1/2019 10:30 AM', '6/4/2019 9:25 AM'),
(4, '2/2/2019 9:41 AM', '5/20/2019 11:54 AM'),
(5, '3/29/2019 7:09 PM', '4/2/2019 10:41 AM')

;WITH cte AS (
    SELECT bookingnum, sd, DATEADD(DAY, 1, EOMONTH(sd)) eom, ed,
        CASE WHEN DATEADD(DAY, 1, EOMONTH(sd)) < ed THEN DATEADD(DAY, 1, EOMONTH(sd)) else ed END AS applied_ed
    FROM @tbl
    UNION ALL 
    SELECT bookingnum, applied_ed, DATEADD(DAY, 1, EOMONTH(applied_ed)) eom, ed,
        CASE WHEN DATEADD(DAY, 1, EOMONTH(applied_ed)) < ed THEN DATEADD(DAY, 1, EOMONTH(applied_ed)) else ed END AS applied_ed
    FROM cte
    WHERE applied_ed < ed
)
SELECT bookingnum, sd, applied_ed AS ed, DATEDIFF(MINUTE, sd, applied_ed) minutes
FROM cte
ORDER BY bookingnum, sd
bookingnum  sd                      ed                          minutes
1           2019-02-05 12:54:00.000 2019-02-08 15:00:00.000     4446
2           2019-05-02 10:41:00.000 2019-05-10 12:39:00.000     11638
3           2019-06-01 10:30:00.000 2019-06-04 09:25:00.000     4255
4           2019-02-02 09:41:00.000 2019-03-01 00:00:00.000     38299
4           2019-03-01 00:00:00.000 2019-04-01 00:00:00.000     44640
4           2019-04-01 00:00:00.000 2019-05-01 00:00:00.000     43200
4           2019-05-01 00:00:00.000 2019-05-20 11:54:00.000     28074
5           2019-03-29 19:09:00.000 2019-04-01 00:00:00.000     3171
5           2019-04-01 00:00:00.000 2019-04-02 10:41:00.000     2081
create table #temp(
BookingNum int,
StartDate datetime,
EndDate datetime,
Location varchar(25),
)

insert into #temp
values(1,'2019-02-05 12:54:00','2019-02-08 15:00:00','Area 1'),
(2,'2019-05-02 10:41:00','2019-05-10 12:39:00','Area 2'),
(3,'2019-06-01 10:30:00','2019-06-04 09:25:00','Area 3'),
(4,'2019-02-02 09:41:00','2019-05-20 11:54:00','Area 1'),
(5,'2019-03-29 19:09:00','2019-04-02 10:41:00','Area 3')


;WITH cte AS
  (
    SELECT BookingNum,
         StartDate,
         CASE
            WHEN DATEPART(m, EndDate) > DATEPART(m, startdate)
            THEN DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, startdate) + 1, 0))
            ELSE EndDate
         END AS EndDate,
         Location,
         DATEPART(m, EndDate) - DATEPART(m, startdate) AS MonthDiff
    FROM #temp

    UNION ALL

    SELECT cte.BookingNum,
         CASE
            WHEN cte.MonthDiff > 0
            THEN DATEADD(month, DATEDIFF(month, 0, DATEADD(month, 1, cte.StartDate)), 0)
            ELSE cte.StartDate
         END AS startDate,
         CASE
            WHEN cte.MonthDiff > 0  AND DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0, DATEADD(month, 1, cte.StartDate)) + 1, 0)) < t.EndDate
            THEN DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0, DATEADD(month, 1, cte.StartDate)) + 1, 0))
            ELSE t.EndDate
         END AS EndDate,
         cte.Location,
         (cte.MonthDiff - 1) MonthDiff
    FROM cte
        INNER JOIN #temp t ON cte.BookingNum = t.BookingNum
    WHERE cte.MonthDiff > 0
)
SELECT BookingNum,
      StartDate,
       EndDate,
       Location,
       DATEPART(m, startdate) AS month,
       DATEDIFF(minute, startdate, enddate) AS minutes  
FROM cte
ORDER BY 1;



drop table #temp
BookingNum  StartDate               EndDate                 Location                  month       minutes
----------- ----------------------- ----------------------- ------------------------- ----------- -----------
1           2019-02-05 12:54:00.000 2019-02-08 15:00:00.000 Area 1                    2           4446
2           2019-05-02 10:41:00.000 2019-05-10 12:39:00.000 Area 2                    5           11638
3           2019-06-01 10:30:00.000 2019-06-04 09:25:00.000 Area 3                    6           4255
4           2019-02-02 09:41:00.000 2019-02-28 23:59:59.000 Area 1                    2           38298
4           2019-03-01 00:00:00.000 2019-03-31 00:00:00.000 Area 1                    3           43200
4           2019-04-01 00:00:00.000 2019-04-30 00:00:00.000 Area 1                    4           41760
4           2019-05-01 00:00:00.000 2019-05-20 11:54:00.000 Area 1                    5           28074
5           2019-03-29 19:09:00.000 2019-03-31 23:59:59.000 Area 3                    3           3170
5           2019-04-01 00:00:00.000 2019-04-02 10:41:00.000 Area 3                    4           2081