Oracle查询中的时间戳范围

时间:2015-09-08 15:03:08

标签: sql oracle timestamp date-arithmetic

我只是尝试在特定时间戳范围内获取结果。我只给了日期,所以我追加了00:00:01'到了约会和' 59:59'到目前为止。

我已经尝试了

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并删除时间段时,使用&lt; =和&gt; =并且两个日期相同,我再没有得到任何结果。

我读过&#39; BETWEEN&#39;是包容性但我在结果中看不到。表字段实际上是时间戳。

3 个答案:

答案 0 :(得分: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')

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

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

如果基础字段是DATE,则应用相同的方法 - 只需使用TO_DATE而不是TO_TIMESTAMP并适当调整格式掩码

答案 1 :(得分: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'

如果您事先知道您的日期格式为 YYYY-MM-DD HH24:MI:SS

,您也可以使用ANSI Timestamp Literal
WHERE   DATE_SENT 
BETWEEN TIMESTAMP '$P{from_date}'||'00:00:01' 
AND     TIMESTAMP '$P{to_Date}'  ||'23:59:59'

答案 2 :(得分:0)

只需使用日期!当您可以在日期使用不等式时,没有理由摆弄时间组件:

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

或者,您更喜欢+ interval 1 day