2013-10-15 32 views
3

問題:給定一週中的某一天(1,2,3,4,5,6,7),開始日期和結束日期,計算一週中給定的一天出現在開始日期和結束日期之間的次數,不包括沒有銷售的日期。T-SQL - 基於銷售確定兩個日期之間的特定天數

語境:

表 「門票」 具有以下結構和樣本內容:

i_ticket_id c_items_total  dt_create_time  dt_close_time 
---------------------------------------------------------------------------- 
1  8.50  '10/1/2012 10:23:00' '10/1/2012 11:05:05' 
2  10.50  '10/1/2012 11:00:00' '10/1/2012 11:45:05' 
3  8.50  '10/2/2012 08:00:00' '10/2/2012 09:25:05' 
4  8.50  '10/4/2012 08:00:00' '10/4/2012 09:25:05' 
5  7.50  '10/5/2012 13:22:23' '10/5/2012 14:33:27' 
. 
. 
233  6.75  '10/31/2012 23:20:00' '10/31/2012 23:55:39' 

詳細

  1. 有可能會或可能不會對任何門票一個月內一天或多天。 (即該地點已關閉/那天/秒)

  2. 業務關閉的日子並不經常。沒有可預測的模式。

基於Get number of weekdays (Sundays, Mondays, Tuesdays) between two dates SQL, 我已經獲得的查詢返回的開始日期和結束日期之間發生一週中的某一天的次數:

DECLARE @dtStart DATETIME = '10/1/2013 04:00:00' 
DECLARE @dtEnd DATETIME = '11/1/2013 03:59:00' 
DECLARE @day_number INTEGER = 1 
DECLARE @numdays INTEGER 

SET @numdays = (SELECT 1 + DATEDIFF(wk, @dtStart, @dtEnd)- 
CASE WHEN DATEPART(weekday, @dtStart) @day_number THEN 1 ELSE 0 END - 
CASE WHEN DATEPART(weekday, @dtEnd) <= @day_number THEN 1 ELSE 0 END) 

現在我只需要以過濾此數據,以便計數中不包含任何零美元天數。任何幫助您可以提供基於票據表內容添加此過濾器非常感謝!

回答

2

如果我理解正確,您可以使用日曆表來計算星期幾爲n和開始與結束之間的天數,並且是具有售票日期的日期,我猜是日期存在於門票和有sum(c_items_total) > 0

WITH cal AS 
(
    SELECT cast('2012-01-01' AS DATE) dt, datepart(weekday, '2012-01-01') dow 
    UNION ALL  
    SELECT dateadd(day, 1, dt), datepart(weekday, dateadd(day, 1, dt)) 
    FROM cal 
    WHERE dt < getdate() 
) 

SELECT COUNT(1) 
FROM cal 
WHERE dow = 5 
    AND dt BETWEEN '2012-04-01' AND '2012-12-31' 
    AND EXISTS (
    SELECT 1 
    FROM tickets 
    WHERE cast(dt_create_time AS DATE) = dt 
    GROUP BY cast(dt_create_time AS DATE) 
    HAVING sum(c_items_total) > 0 
    ) 
OPTION (MAXRECURSION 0) 

SQLFiddle

+0

這基本上工作。我不得不稍微修改它來照顧一對夫婦的情況,但前提是合理的。我將標記爲「已回答」,但有興趣查看是否有其他方法。 – user2883571

相關問題