【问题标题】:Date Condition with Case when Holiday exclude不包括假期的情况下的日期条件
【发布时间】:2019-08-17 12:49:10
【问题描述】:

我需要从月初的销售,即 8 月 1 日到 8 月 16 日,所以这是我的销售查询 - 这里 Net_Amount 是销售数字的列,

select sum(case when Date=FORMAT(GetDate()-1, 'yyyy-MM-dd') 
                then Net_Amount else 0
           end) as TodaysSales
From SalesM

现在我们有星期五假期,我希望如果星期五来了,那么它应该从 8 月 1 日到 8 月 15 日,即星期四。我有一个表日期表有一个列 Isweekend ='1' for Friday ,我如何在我的查询中使用它,因为我已经放了一个案例 SalesM 表有 Month 列,Date 表也有月份和年份列。

select case when satrndd = FORMAT(GetDate()-1, 'yyyy-MM-dd' )
            then inna when IsWeekend='1' then 
           else 0
       end as Todaystotal


select case when satrndd = FORMAT(GetDate()-1, 'yyyy-MM-dd' )
            then inna
            when IsWeekend='1' then 
            else 0
       end as Todaystotal

【问题讨论】:

  • 为此您需要一个日历表。有很多关于如何实现目标的例子,其中很多都是关于 SO 的。您对此事的搜索(两个日期之间的天数,不包括周末/节假日)告诉了您什么,以及您不了解的哪些内容,以便我们向您解释它们是如何工作的?
  • 另一方面,如果没有人向您提及它:SQL Server 2008 现在完全不支持了。建议您尽快查看升级路径。
  • 您能否添加一些具有表结构和预期输出的示例数据?
  • 输出是我需要昨天的总销售额所以昨天是假期对我们来说,如果我将使用此查询选择 sum(case when Date=FORMAT(GetDate()-1, 'yyyy-MM- dd') 然后 Net_Amount else 0 end) as TodaysSales 然后这个查询给我零结果,因为昨天是假期所以而不是假期,它应该将 8 月 15 日算作销售额
  • 如果你使用的是 SQL Server 2008,你不可能使用FORMAT;它是在 2012 年推出的(无论如何最好避免先生,因为它的性能不佳)。

标签: sql sql-server sql-server-2008


【解决方案1】:

如果我猜对了,如果星期五是您日期范围的开始日期或结束日期,您希望避开星期五。如果我希望您有两个日期时间类型的参数@start_date_param 和@end_date_param,那么下面的逻辑应该可以工作-

CASE 
    WHEN DATENAME(weekday,@start_date_param) = 'Friday' 
        THEN DATEADD(DD,1,@start_date_param)
    ELSE @start_date_param
END StartDate,
CASE 
    WHEN DATENAME(weekday,@end_date_param) = 'Friday' 
        THEN DATEADD(DD,-1,@end_date_param)
    ELSE @end_date_param
END EndDate

【讨论】:

  • 我有开始日期和结束日期,实际上我已经输出了昨天的一列销售额,即 8 月 16 日,在第二列中,我正在检索从 8 月 1 日到 8 月 16 日的销售额,所以第二列的销售额即将到来是的,但第一列的销售额完全按照昨天的单日销售额计算。所以昨天是假期,所以销售额为零,但如果昨天是假期,那么 8 月 15 日应该算作销售额
  • 您可以在脚本中应用给定的逻辑。它应该可以工作。
  • 您能否将您的查询发布到您试图计算今天和截至今天总计的 2 个值的位置?这也会有所帮助。
【解决方案2】:

以下 case 表达式适用于您要查找的第二列 (Sales_SOM_to_TillDate):

如果不是星期五,它会考虑“昨天”,否则会是“前天”,您可以添加自己的逻辑,以防“前天”不符合需求

CASE WHEN satrndd BETWEEN 
        DATEFROMPARTS (DATEPART(YEAR, GETDATE ()), DATEPART(MONTH, GETDATE() ), 1 ) and  -- Start of the month
        IIF (DATENAME (WEEKDAY, GETDATE() ) = 'Friday', FORMAT(GetDate()-2, 'yyyy-MM-dd' ), FORMAT(GetDate()-1, 'yyyy-MM-dd' )) -- It would be "Yesterday" when not friday, otherwise would be "Day before yesterday" you can add your own logic in case "day before yesterday" would not fits the needs
    THEN Net_Amount 
    Else 0 END

如果您想使用数据库中存在的Date 表,我相信Isweekend =1 应该属于where 原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多