SQL在什么情况下

时间:2018-11-15 11:28:27

标签: sql sql-server

我有一个销售表

如果最高日期SalePeriodFrom = 20181101

,我希望执行以下操作选择可用的数据日期

(如果SalePeriodFrom的最高值来自 2018年11月11日-可以使用月初数据)

如果不从前一天(前一个月的最后一天31/10/2018)获取数据

我的代码是

Select *
from Sales

Where case when SalePeriodFrom > DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0) then   

  (SalePeriodFrom  <= DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0)
  and (SalePeriodTo > '20010101' or
  SalePeriodTo is null))

   else (SalePeriodFrom <= DATEADD(DAY, -(DAY(GETDATE())), GETDATE())
  and (SalePeriodTo > '20010101' or
  SalePeriodTo is null)) end 

我似乎无法解决这个问题,请提出任何想法

3 个答案:

答案 0 :(得分:2)

这似乎是在复制CASE表达式中的布尔表达式,但是,如果没有示例数据,我将无法进行检查:

SELECT {List of Columns} --You should probably list your columns here
FROM dbo.Sales --Assumed dbo schema
WHERE (SalePeriodFrom > DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0)
  AND  (SalePeriodTo > '20181101' OR SalePeriodTo IS NULL))
   OR (SalePeriodFrom <= DATEADD(DAY, -(DAY(GETDATE())), GETDATE())
  AND (SalePeriodTo > '20010101' OR SalePeriodTo IS NULL));

就像在问题评论中提到的那样,它根本不使用CASE表达式。在列上使用CASE会导致查询变得无法SARG,因此(通常)最好避免使用它们。

请注意,我已经删除了SalePeriodFrom <= DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0)子句。这实际上没有任何意义,因为您似乎正在尝试检查SalePeriodFrom的值是否大于(>)且小于或等于(<=)表达式DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0)。大于小于等于的值是不可能的。例如,1大于0,但不等于或小于它。 0小于或等于0,但不大于。

答案 1 :(得分:0)

如上所述,第一个WHEN条件始终为false,因此您可以将其丢弃。

SELECT * FROM Sales
WHERE SalePeriodFrom <= DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0) AND
      (SalePeriodFrom <= DATEADD(DAY, -(DAY(GETDATE())), GETDATE()) AND 
      (SalePeriodTo > '20010101' OR SalePeriodTo is null))

答案 2 :(得分:0)

您的问题逻辑确实很乱,很难理解。把它读回去,或者大声地读给同事,看看他们是否了解您的情况

我对您的要求的理解是:

如果销售表中包含2018年11月1日以来的任何数据,则返回日期为2018年11月1日的所有数据,否则返回日期为2018年10月31日的任何数据

select *
from sales
where SalePeriodFrom = 
    (SELECT MAX(saleperiodfrom) FROM sales WHERE saleperiodfrom IN ('2018-11-01', '2018-10-30'))

如果两个日期或仅11月1日都有数据,则MAX()将返回11月1日。如果从11月1日起没有数据,但是从10月30日起有数据,则MAX将返回10月30日。如果两个日期都没有数据,则最大值将不返回任何内容,并且您将不会获得任何数据

如果我误解了您的要求,请更清楚地说明

——————————————————————————————

编辑:

或者您的意思是:

如果sales表包含日期为2018年11月1日的任何数据,请在2018年11月01日午夜之后返回所有数据,否则在2018年10月31日午夜之后返回任何数据

select *
from sales
where SalePeriodFrom >= 
    (SELECT MAX(saleperiodfrom) FROM sales WHERE saleperiodfrom IN ('2018-11-01', '2018-10-30'))