mysql - 数据库查询: [Union]/[or condition in where clause]

标签 mysql sql oracle sybase

我必须根据 TransDate 和 ValueDate 获取记录

根据以下条件获取记录:

  1. TransDate 为 2016 年 3 月 20 日或之前,ValueDate 为 2016 年 3 月 20 日
  2. ValueDate 为 2016 年 3 月 20 日或之前,TransDate 为 2016 年 3 月 20 日

我的同事尝试将 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 都是时间戳数据类型。

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

最佳答案

两个查询的结果没有差异。但时间成本可能会有所不同。

我认为第二个会更快。

这是另一种选择:

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')

关于mysql - 数据库查询: [Union]/[or condition in where clause],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36256935/

相关文章:

sql - 如何从多个表中选择公共(public)元素?

sql - 在 pivot xml 之后将 xmltype 解析为表

php - 试图从数据库中查看表,但显然我的语法不正确,尽管它与 PHPmyAdmin 上的查询匹配

php - 无法插入 SQL 表或显示全部来自

PHP 数据库未使用正确的值进行更新

c++ - 为什么我的 Redhat 服务器上的 QuickFIX 进程没有将它的核心文件写到它应该写的地方?

java - JDBC 瘦驱动程序 : Invalid Packet Lenght [sic]

php - mySql 中的有效或无效状态

mysql随机更新两个日期之间的日期列(有条件)

mysqli - 如何在没有 PHP 的情况下计算插入之前的行数?