我有一个销售表
如果最高日期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
我似乎无法解决这个问题,请提出任何想法
答案 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'))