【问题标题】:T-SQL - Determine number of specific days between 2 dates based on salesT-SQL - 根据销售额确定两个日期之间的特定天数
【发布时间】:2013-10-15 17:37:33
【问题描述】:

问题:给定一周中的某一天(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'

详情

  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)

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

【问题讨论】:

    标签: datetime sql-server-2008-r2 datediff


    【解决方案1】:

    如果我理解正确,您可以使用日历表来计算星期几为 n 以及开始和结束之间的天数,并且是有售票的日期,我猜是日期存在的日期在门票和有sum(c_items_total) &gt; 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

    【讨论】:

    • 这基本上有效。我不得不稍微修改它以处理几个边缘情况,但前提是合理的。我将标记为“已回答”,但有兴趣看看是否还有其他方法。
    猜你喜欢
    • 2018-05-06
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多