数据库查询:[Union] / [或where子句中的条件]

时间:2016-03-28 06:10:45

标签: mysql sql oracle sybase

我必须根据TransDate和ValueDate

获取记录

根据以下标准获取记录:

  1. TransDate于2016年3月20日或之前,而ValueDate将于2016年3月20日
  2. ValueDate于2016年3月20日或之前,TransDate于2016年3月20日
  3. 我的同事尝试使用UNION以及以下查询

      select * from Sales where ValueDate < '2016-03-21' and ValueDate >= '2016-03-20' 
        and TransDate < '2016-03-21'
    Union 
      select * from Sales where TransDate < '2016-03-21' and TransDate >= '2016-03-20' 
        and ValueDate < '2016-03-21'
    

    但我觉得用以下方式重写该查询

    select * from Sales where ((ValueDate < '2016-03-21' and ValueDate >= '2016-03-20' 
        and TransDate < '2016-03-21') or (TransDate < '2016-03-21' 
        and TransDate >= '2016-03-20' and ValueDate < '2016-03-21'))
    

    注意:TransDate和ValueDate都是时间戳数据类型。

    请建议两个查询的区别,否则,如果有其他方法最好建议我。

1 个答案:

答案 0 :(得分:0)

两个查询之间的结果没有区别。但时间成本时间可能不同。

我认为第二个会更快。

这是另一种选择:

select * from Sales 
where 
    (DATE(ValueDate) = '2016-03-20' and TransDate < '2016-03-21') or 
    (DATE(TransDate) = '2016-03-20' and ValueDate < '2016-03-21')