我只是尝试在特定时间戳范围内获取结果。我只给了日期,所以我追加了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;是包容性但我在结果中看不到。表字段实际上是时间戳。
答案 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 LiteralWHERE 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
。