繁体   English   中英

Oracle 查询中的时间戳范围

[英]Timestamp range in Oracle query

我只是想在特定的时间戳范围内获得结果。 我只给出了日期,所以我将“00:00:01”附加到起始日期,将“23: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 并删除时间部分时,使用 <= 和 >= 并且两个日期相同,我再次没有得到任何结果。

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

首先检查该字段是否实际上是时间戳,因为您似乎只是在处理 DATE 数据类型完全支持的秒级粒度。

其次,当涉及到 DATE 或 TIMESTAMP 的转换时,假设 NLS 设置使用的默认格式是一个坏主意,因为依赖于受格式影响的任何类型的隐式转换。 请记住,时间戳数据类型包括小数秒。 因此,如果它是时间戳列而不是日期,并且您将日期作为格式为“YYYY/MM/DD”的字符串获取,则执行以下操作:

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

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

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

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

是的, BETWEEN包括条件之间的上限下限

问题似乎是缺少Format Model ,因此可能会应用特定语言环境的客户端 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 时间戳文字

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

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

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

或者,根据您的喜好, + interval 1 day

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM