0

在我的网站中,我必须存储两种类型的交货日期合同交货日期和订单的调整交货日期。基本上合同日期是订单时产品的交货日期。调整日期是日期的调整者,可以更小或更大然后合同日期

表如下:

id   product_name  condeldat adjdeldate
----------------------------------------
1     drilling      2011-05    2012-01
2     lathe         2012-06

我必须检查是否有任何产品已调整日期然后选择调整日期否则合同日期

完成以下查询:

select id,
       product_name,
       if(adjdeldat is not NULL, adjdeldat, condeldat) as delivery_date     
 from orders

上面的查询工作正常,但我必须得到任何交货日期的产品(如果(adjdelcat 不是 NULL,adjdeldat,condetdat))> 去年(现在它将是 2011 年)。所以我的问题是如何在哪里应用相同的条件条款?

4

3 回答 3

0

使用有表达:

 select id, product_name,
 if(adjdeldat is not NULL, adjdeldat, condeldat) as delivery_date     
 from orders  HAVING delivery_date BETWEEN 'beginDate' AND 'endDate'
于 2012-04-07T17:19:40.717 回答
0

使用派生表/内联视图:

SELECT x.id, x.product_name, x.delivery_date  
  FROM (SELECT o.id, o.product_name, IFNULL(o.adjdeldat, o.condeldat) AS delivery_date
          FROM ORDERS o) x
 WHERE x.delivery_date BETWEEN '2011-01-01' AND '2011-12-31' 
  • COALESCE您可以用 ANSI或 CASE 语句替换 IFNULL
  • 始终比较具有相同数据类型的值,否则您的查询不能使用索引(如果存在)
  • 根据操作,优化器可能会使用谓词推送(在这种情况下不太可能)将外部查询的过滤推送到内部查询中
于 2012-04-07T17:21:25.677 回答
0

您需要使条件等同于if elseusing AND,OR

试试下面:

SELECT id,product_name,if(adjdeldat is not NULL,adjdeldat,condeldat) as delivery_date 
FROM orders  
WHERE ((adjdeldat is NULL and left(condeldat) > 2011) OR left(adjdeldat) > 2011)

对于去年动态获取,您可以使用:

(left(curdate(),4)-1) in place of 2011
于 2012-04-07T17:04:50.113 回答