Oracle中的日期比较问题

时间:2016-02-24 13:13:24

标签: sql oracle date

我在oracle中进行日期比较。 当我执行下面的代码时

select tr.x, tbi.y, to_char(tr.UPDATED_AT,'dd-mon-yyyy')
from  tbi, tb, tr
where
tbi.id=tb.id and
tb.id=tr.id  and 
tr.updated_at = to_date('23/02/2016', 'dd/MM/yyyy') 

未选择任何行

但是当我执行以下查询时

select tr.x, tbi.y, to_char(tr.UPDATED_AT,'dd-mon-yyyy')
from  tbi, tb, tr
where
tbi.id=tb.id and
tb.id=tr.id 
and 
tr.updated_at > to_date('23/02/2016', 'dd/MM/yyyy') 

我得到了这个结果

trx.x  tbi.y TO_CHAR(TR.UPDATED_AT,'DD-MM-YYYY')
123456  0    23-02-2016
12345   0    23-02-2016
123     0    23-02-2016
123123  0    23-02-2016

为什么>运算符显示的日期相等且=未显示相等的日期?

5 个答案:

答案 0 :(得分:1)

你应该使用TRUNC()

select tr.x, tbi.y, to_char(tr.UPDATED_AT,'dd-mon-yyyy')
from  tbi, tb, tr
where
tbi.id=tb.id and
tb.id=tr.id 
and 
trunc(tr.updated_at) = to_date('23/02/2016', 'dd/MM/yyyy')

您的查询问题(我猜它看起来)你的updated_at格式是dd / mm / yyyy hh24:mi:ss。

所以,2016年2月23日不等于23/02/2016 20:00:05。 (默认hh24:mi:日期的ss是00:00:00)

Trunc()使日期格式化为dd / mm / yyyy并忽略小时数

答案 1 :(得分:0)

<强>问题

tr.updated_at = to_date('23/02/2016', 'dd/MM/yyyy') 

仅返回updated_at等于23/02/2016 00:00:00

的结果

<强>溶液

请尝试以下方法:

trunc(tr.updated_at) = to_date('23/02/2016', 'dd/MM/yyyy') 

cf trunc function documentation

答案 2 :(得分:0)

app/etc/local.xml

尝试使用此输出:

选择tr.x,tbi.y,to_char(tr.UPDATED_AT,'dd-mon-yyyy')     来自tbi,tb,tr     哪里     tbi.id = tb.id和     tb.id = tr.id和     to_char(tr.updated_at,'dd / mm / yyyy')= to_date('23 / 02/2016','dd / MM / yyyy')

答案 3 :(得分:0)

如其他答案所示,使用TRUNC使得无法在此字段上使用索引(基于函数的索引除外)。因此,您可能更喜欢

tr.updated_at between to_date('23/02/2016', 'dd/mm/yyyy')
                  and to_date('23/02/2016 23:59:59', 'dd/mm/yyyy hh24:mi:ss') 

答案 4 :(得分:0)

条款

tr.updated_at = to_date('23/02/2016', 'dd/MM/yyyy') 
由于表TR中的Updated_at字段是存储时间戳的日期时间字段,因此

不返回任何结果。

例如:23-02-2016 00:00:00

因此,当您使用Equals运算符时,由于子句的RHS缺少时间戳,它返回false。

出于性能原因和避免歧义,我建议在日期范围内使用之间或在Tr.Updated_at上使用 Trunc 函数。

例如:Trunc(tr.updated_at)= to_date('23 / 02/2016','dd / MM / yyyy')