2017-04-19 59 views
1

我想不出一個好的方式來說明這個問題,如果它已被問到,就可以正確搜索。在一個日期範圍內計算一次發生的次數

我正在尋找SQL 2008 R2中的一種方法來計算兩個日期時間值之間發生的下午6點多少次。下午6時

例如和之間「2017年4月17日19時00分00秒」「2017年4月19日17點00分00秒」只發生一次,即使多次跨越3個不同天。

之間'2017年4月17日18:00:00''2017年4月19日18:00:00'它發生的3倍,同時還跨越3天。

繼承人真的很愚蠢的表達我想要插圖。

timecount(hh, 6, min(datefield), max(datefield)) 

謝謝

+0

怎麼樣,如果你有很長的日期範圍像一個月年? –

回答

1

一個簡單的查詢數:

DECLARE @StartDate datetime = '2017-04-17 18:00:00' 

DECLARE @EndDate datetime = '2017-04-19 18:00:00' 

SELECT 
    CASE 
     WHEN CAST(@StartDate AS time) <= '18:00' AND CAST(@EndDate AS time) >= '18:00' 
      THEN datediff(day, @StartDate, @EndDate) + 1 
     WHEN CAST(@StartDate AS time) <= '18:00' AND CAST(@EndDate AS time) < '18:00' 
      THEN datediff(day, @StartDate, @EndDate)  
     WHEN CAST(@StartDate AS time) > '18:00' AND CAST(@EndDate AS time) >= '18:00' 
      THEN datediff(day, @StartDate, @EndDate) 
     ELSE datediff(day, @StartDate, @EndDate) - 1 
    END AS TotalCount 
+0

謝謝,這很好地完成了這項工作。 –

1

這會給你每一個小時和出現次數的數量:

select datepart(hh, DateColumn) as TheHours, count(*) as occurs 
from MyTable 
where DateColumn between @SomeDate and @SomeOtherDate 
group by datepart(hh, DateColumn) 

或只爲18:00:

select count(*) 
from MyTable 
where datepart(hh, DateColumn) = 18 
and DateColumn between @SomeDate and @SomeOtherDate 
0

嘗試以下公式我曾嘗試以不同的方案,它的工作原理,讓我知道如果我錯過任何情況下,不按您的要求工作。

DECLARE @firstDate Datetime='17-Apr-2017 17:00:00' 
DECLARE @secondDate Datetime='17-Apr-2017 18:59:00' 


SELECT 
    CASE WHEN DATEDIFF(day,@firstDate,@secondDate)=0 
    THEN IIF(CAST(@firstDate AS TIME) <='18:00' AND DATEPART(hh,@secondDate) >=18,1,0) 
    ELSE 
     CASE WHEN 
      (
       CAST(@firstDate AS TIME) <='18:00' AND CAST(@secondDate AS TIME) <'18:00' 
       OR 
       CAST(@firstDate AS TIME) >'18:00' AND CAST(@secondDate AS TIME) >='18:00' 
      ) 
      THEN DATEDIFF(day,@firstDate,@secondDate) 
      WHEN CAST(@firstDate AS TIME) <='18:00' AND CAST(@secondDate AS TIME) >='18:00' THEN DATEDIFF(day,@firstDate,@secondDate)+1 
      ELSE DATEDIFF(day,@firstDate,@secondDate)-1 
      END 
    END AS TotalCount 
+0

嗨,我得到這個語法錯誤,但不能完全弄清楚它是什麼 Msg 102,Level 15,State 1,Line 7 '<'附近的語法不正確。 –

+0

不可能,使用我的SQL,我只是再次測試 –

+0

任何事情都可能:),也許不同的SQL版本我不知道。 –

0

嘗試下面的腳本,使用CTE

DECLARE @F_DATE  AS DATETIME = '2017-04-17 19:00:00' 
     ,@T_DATE AS DATETIME = '2017-04-19 17:00:00' 


;WITH CTE 
AS (
    SELECT (CASE WHEN DATEPART(HH,@F_DATE) <= 18 
       THEN @F_DATE 
       ELSE (CASE WHEN DATEDIFF(DAY,@F_DATE,@T_DATE) > 0 
         THEN DATEADD(DAY,1,@F_DATE) END) 
      END) AS CDATE 

    UNION ALL 

    SELECT DATEADD(DAY,1,CDATE) 
    FROM CTE 
    WHERE DATEADD(DAY,1,CDATE) <= @T_DATE 
) 

SELECT COUNT(CDATE) DATE_COUNT 
FROM CTE 
OPTION (MAXRECURSION 0) 
+0

無關.CTE有一些流量:maxrecursion深度和性能。除非沒有其他辦法,否則最好避免使用CTE。 –

1
DECLARE 
    @Time time = '18:00', 
    @From datetime = '2017-04-17 18:00:00', 
    @To datetime = '2017-04-19 18:00:00' 


SELECT 
    CASE 
     -- Same date 
     WHEN DATEDIFF(DAY, @From, @To) = 0 THEN 
      CASE WHEN CAST(CAST(@From AS date) AS datetime) + @Time BETWEEN @From AND @To THEN 1 ELSE 0 END 
     -- Not same date 
     WHEN @From <= @To THEN 
      CASE WHEN @Time >= CAST(@From AS time) THEN 1 ELSE 0 END 
      + DATEDIFF(DAY, @From, @To) - 1 
      + CASE WHEN @Time <= CAST(@To AS time) THEN 1 ELSE 0 END 
     -- Invalid range 
     ELSE 0 
    END AS CountOfTime 
0

這裏有兩個日期時間之間的每個下午6點的計數:

DECLARE @StartDate datetime 
DECLARE @EndDate datetime 
set @StartDate = '2017-04-17 19:00:00' 
set @EndDate = '2017-04-19 17:00:00' 

;WITH cte1 (S) AS (
SELECT 1 FROM (VALUES (1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) n (S) 
), 
cte2 (S) AS (SELECT 1 FROM cte1 AS cte1 CROSS JOIN cte1 AS cte2), 
cte3 (S) AS (SELECT 1 FROM cte1 AS cte1 CROSS JOIN cte2 AS cte2) 

select count(datepart(hour,result)) as count from 
(SELECT TOP (DATEDIFF(hour, @StartDate, @EndDate) + 1) 
     result = DATEADD(hour, ROW_NUMBER() OVER(ORDER BY S) - 1, @StartDate) 
FROM cte3) as res where datepart(hour,result) = 18 

這裏是下午6點的兩個日期時間之間的詳細視圖:

DECLARE @StartDate datetime 
DECLARE @EndDate datetime 
set @StartDate = '2017-04-17 19:00:00' 
set @EndDate = '2017-04-19 17:00:00' 

;WITH cte1 (S) AS (
SELECT 1 FROM (VALUES (1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) n (S) 
), 
cte2 (S) AS (SELECT 1 FROM cte1 AS cte1 CROSS JOIN cte1 AS cte2), 
cte3 (S) AS (SELECT 1 FROM cte1 AS cte1 CROSS JOIN cte2 AS cte2) 

select result,datepart(hour,result) from 
(SELECT TOP (DATEDIFF(hour, @StartDate, @EndDate) + 1) 
     result = DATEADD(hour, ROW_NUMBER() OVER(ORDER BY S) - 1, @StartDate) 
FROM cte3) as res where datepart(hour,result) = 18 
0

這裏給出任何日期間的計數範圍

declare @time datetime='06:00:00' 

declare @startDate datetime='04/20/2017 05:00:00' 

declare @enddate datetime='04/21/2017 05:00:00' 

SELECT 
    case 
    WHEN datediff(ss,@time, convert(time(0),@startDate)) <=0 and datediff(ss,@time, convert(time(0),@enddate)) >=0 

    THEN datediff(dd,@startDate,@enddate) +1 
WHEN (datediff(ss,@time, convert(time(0),@startDate)) <=0 and 
datediff(ss,@time, convert(time(0),@enddate)) <=0 

     OR 
     datediff(ss,@time, convert(time(0),@startDate))> 0 and 

datediff(ss,@time, convert(time(0),@enddate)) >0 

     OR 

     datediff(ss,@time, convert(time(0),@startDate))> 0 and datediff(ss,@time, convert(time(0),@enddate)) <=0 
     ) 
then datediff(dd,@startDate,@enddate) 
ELSE 
datediff(dd,@startDate,@enddate)-1 
END 
相關問題