2015-09-08 148 views
1

我只是试图在特定的时间戳范围内获取结果。我仅给出日期,因此我将“00:00:01”添加到最新版本,并将“23:59:59”添加到迄今为止。Oracle查询中的时间戳范围

我已经试过

WHERE DATE_SENT > (to_timestamp($P{FROM_DATE}||'00:00:01')) 
DATE_SENT < (to_timestamp($P{TO_DATE}||'23:59:59')) 

WHERE DATE_SENT BETWEEN (to_timestamp($P{FROM_DATE}||'00:00:01')) AND (to_timestamp($P{TO_DATE}||'23:59:59')) 

然而,无论似乎工作。如果日期和日期都是同一日期,我只是不会收到任何数据。当我使用to_date并删除时间部分时,使用< =和> =并且两个日期相同,我再也没有结果。

我读到'BETWEEN'是包容性的,但在结果中没有看到。表格字段实际上是时间戳。

回答

0

是,BETWEEN包括范围的条件之间。

这个问题似乎是缺少业态模式,由于它的区域设置特定的客户端NLS设置可能适用,因此表现出不正确的行为。

此外,你可以简单地使用TO_DATE而不是TO_TIMESTAMP为日期数据类型日期和时间元素。

WHERE DATE_SENT 
BETWEEN TO_DATE($P{from_date}||'00:00:01', '<date_format>HH24:MI:SS') 
AND  TO_DATE($P{to_Date} ||'23:59:59',''<date_format>HH24:MI:SS') 

确保将正确的<date_format,例如,'MM/DD/YYYY'

您也可以使用ANSI Timestamp Literal如果您的日期格式可以被你提前为YYYY-MM-DD HH24:MI:SS

WHERE DATE_SENT 
BETWEEN TIMESTAMP '$P{from_date}'||'00:00:01' 
AND  TIMESTAMP '$P{to_Date}' ||'23:59:59' 
1

首先检查该字段实际上是一个时间戳因为你看起来只是在处理粒度到DATE数据类型完全支持的第二个粒度。其次,当涉及到DATE或TIMESTAMP的转换时,对NLS设置使用的默认格式做出假设是一个坏主意,正如依赖于受格式影响的任何种类的隐式转换一样。请记住Timestamp数据类型包含小数秒。因此,如果它是一个时间戳列而不是日期,并且如果以格式“YYYY/MM/DD”中的字符串获取日期,则请执行以下操作:

to_timestamp($ P {FROM_DATE} || '00:00:01.000000','YYYY/MM/DD HH24:MI:SS.FF')

确保它将您的字符串转换为正确的日期。

可能发生的情况是,字符串参数和默认日期格式不同步,所以它所确定的时间戳不在数据范围内。

如果基础字段是一个日期,那么同样的方法也适用 - 只需使用TO_DATE代替TO_TIMESTAMP并调整格式掩码适当

0

只需使用日期!没有理由随着时间的组件来摆弄,当你可以只使用不平等的日期:

WHERE DATE_SENT >= to_timestamp($P{FROM_DATE}) 
     DATE_SENT < to_timestamp($P{TO_DATE}) + 1 

或者,你喜欢,+ interval 1 day

+0

'TO_DATE'和'TO_TIMESTAMP [_TZ]'功能应该总是(如总是)包括格式掩码,以避免在'NLS_DATE_FORMAT'和/或'NSL_TIMESTAMP [_TZ] _FORMAT'设置变化引起的错误。 – Sentinel