我在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
为什么>
运算符显示的日期相等且=
未显示相等的日期?
答案 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')
答案 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')