我正在敲打桌子,试图在SQL中解决问题,我理解逻辑,我可以轻松地在Excel中完成任务,但那里的乐趣在哪里:)
有问题的数据库作为WorkOrder表,我选择以下列:
SELECT WorkOrderNumber,
WorkOrderDescription,
WorkOrderHistoryDescription,
RaisedDateTime,
FinishedDateTime
我需要做的是返回在给定月份内筹集的所有工作订单,这很容易:
WHERE RaisedDateTime >= CONVERT(DATETIME, '2014-12-01' ) and <= CONVERT(DATETIME, '2014-12-31' )
踢球者是我也希望那些返回那些之前被提出但在给定月份被关闭的记录,我尝试了以下似乎有效的方法:
WHERE ( RaisedDateTime >= CONVERT(DATETIME, '2014-12-01' ) AND RaisedDateTime <= CONVERT(DATETIME, '2014-12-31' ) )
OR ( FinishedDateTime >= CONVERT(DATETIME, '2014-12-01' ) AND FinishedDateTime <= CONVERT(DATETIME, '2014-12-31' ) AND RaisedDateTime < CONVERT(DATETIME, '2014-12-01' ) )
然而,当我在上面的语句后面插入PreventativeMaintenanceID IS NULL时,我发现在该列中有值的工作订单,如果我只有WHERE语句的第一行,一切正常。
我可能出错的任何想法/指示?我当时想看看我是否可以使用CASE声明但是我无法让它工作。
答案 0 :(得分:1)
如果不知道您的完整查询的确切外观,但很难判断除了该行之外的其他条件,然后在分组标准之后添加该行,如下所示:
SELECT WorkOrderNumber,
WorkOrderDescription,
WorkOrderHistoryDescription,
RaisedDateTime,
FinishedDateTime
from tbl
WHERE (
(RaisedDateTime between CONVERT(DATETIME, '2014-12-01') AND
CONVERT(DATETIME, '2014-12-31')) OR
(FinishedDateTime between CONVERT(DATETIME, '2014-12-01') AND
CONVERT(DATETIME, '2014-12-31') AND
RaisedDateTime < CONVERT(DATETIME, '2014-12-01'))
)
and PreventativeMaintenanceID IS NULL
根据您的描述,由于OR
,它听起来像是一个操作顺序问题