Datetime T-SQL-根据销售额确定两个日期之间的特定天数

Datetime T-SQL-根据销售额确定两个日期之间的特定天数,datetime,sql-server-2008-r2,datediff,Datetime,Sql Server 2008 R2,Datediff,问题是:给定一周中的一天1、2、3、4、5、6、7、开始日期和结束日期,计算一周中给定日期在开始日期和结束日期之间出现的次数,不包括没有销售的日期 背景: 表Ticket具有以下结构和示例内容: i_ticket_id c_items_total dt_create_time dt_close_time ---------------------------------------------------------------------------- 1

问题是:给定一周中的一天1、2、3、4、5、6、7、开始日期和结束日期,计算一周中给定日期在开始日期和结束日期之间出现的次数,不包括没有销售的日期

背景:

表Ticket具有以下结构和示例内容:

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'
细节

一个月内的一天或几天可能有票,也可能没有票。i、 那地方那天关门了

营业结束的日子不是固定的。没有可预测的模式

基于, 我派生了一个查询,返回一周中某一天在开始日期和结束日期之间发生的次数:

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)

现在我只需要过滤它,这样任何零美元天数都不包括在计数中。非常感谢您提供的任何帮助,以便根据tickets表的内容添加此过滤器

如果我理解正确,您可以使用日历表来计算星期日为n且介于开始和结束之间的天数,这是一个有门票销售的日期,我猜是指该日期存在于门票中且sumc_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)