oracle PLSQL-仅提供时间戳的小时,分​​钟和秒

时间:2017-12-04 16:19:48

标签: oracle timestamp

有没有办法只从时间戳中提取HOUR,MINUTES和Second ..随着日期ofc但我不希望它显示fractional_seconds_precision ..所以例如当我键入以下内容时:

TO_TIMESTAMP('2017-12-02 05:00:00', 'YYYY-MM-DD HH24:MI:SS')

我只想要我在格式中指定的内容,我不希望显示FF,但每当我检查输出时,FF总是随之而来。我该如何删除它?另外,我想问一下,有没有办法比较使用时间戳键入的日期与使用TO_DATE键入的日期进行比较?如果我想要一个时间戳而另一个是TO_DATE格式怎么办?感谢

2 个答案:

答案 0 :(得分:0)

你的问题确实没有意义,但我理解你为什么这么问。

基本上,你说的是“我有这个字符串"1"但是当我将它解析为数字时,它在小数点后面有大量的数字:1.0000000000000。如何在没有这些额外的情况下存储它零“

答案是,你不能:11.000000000是相同的东西,它们以相同的方式存储,而不是由你来决定它是如何存储的。您看到1.000000000的输出是因为您没有要求以特定格式输出内部数字1(例如$ 1.00),所以您只是将其输入数据库或您正在使用的查询工具的默认格式

最终,不要担心 - 隐藏或显示那些零作为开发人员并不重要。当您再次查询时间戳时包括与否,这并不重要。当您的前端应用程序将内容转储到报表时,它应该从Oracle检索时间戳并执行格式化本身;将$ 1存储为数字1,而不是字符串“$ 1”。当需要将其放在报告上时,请在生成报告的代码中将其格式化为$ 1.00。

如果您正在运行使用时间戳字段的查询,则可以将日期与日期进行比较...只需记住日期和时间戳也有时间组件,因此请使用范围查询它们。例如,获取时间戳为今天的所有行:

select * from t where mytimestamp >= trunc(sysdate) and mytimestamp < trunc(sysdate)+1

这比做更好:

select * from t where trunc(mytimestamp) = trunc(sysdate)

因为trunc(mystimestamp)意味着你正在操作表数据来运行查询。除非您专门为trunc(mytimestamp)的输出编制了索引,否则此查询可能像狗一样运行,因为如果查询要求在比较之前操作表数据,则无法使用mytimestamp列上的索引< / p>

可能有助于您在内部考虑,日期通常存储为自历史记录中某个点以来的天数。时间是一天的一小部分。内部01-jan-1970 00:00可能是001-jan-1970 18:00,即下午6点,是一天中的四分之三,所以它将被存储为0.75。因此,02-jan-1970将被存储为1.当您使用trunc时,您将删除小数部分。这就是为什么截断“删除”日期的时间。它不会“删除”它 - 你无法删除时间,因为发生的一切都发生在某个时间点。但它确实将时间组件减少到午夜,所以trunc()所有的adtes在一张桌子中有效地使它们全部发生在当天的午夜。

当涉及到日期时,Oracle可以截断到其他事情,例如到月初,但是现在,请记住内部是小数,使用范围查询它们(所以“在1970年1月1日到1970年2月2日之间) “真的是说”介于0和1之间“ - 这是0.75,即1970年1月1日下午6点,是)

答案 1 :(得分:0)

将字符串转换为时间戳(或日期)时,结果为internal Oracle format,您通常不必担心。你只需要知道它在内部并不像你输入的那样。

查询时间戳时,客户端决定如何使用NLS设置格式化显示的时间戳。虽然您可以修改它们,但通常最好不要依赖它们 - 因为运行代码的其他人可能有不同的设置 - 并明确地将时间戳转换为字符串using the to_char() function和合适的format model 。在这种情况下:

select to_char(your_column, 'YYYY-MM-DD HH24:MI:SS') from your_table

但这只是出于显示目的;当您使用时间戳值 - 例如添加或删除间隔时 - 将其保留为时间戳,并避免执行任何会导致隐式转换为其他数据类型的操作,因为这可能会导致各种问题。 / p>

在您的示例中,小数秒部分将为零,但情况可能并非总是如此。如果您实际上具有非零小数秒的值,并且希望在进行计算时忽略这些值,则可以将值cast() implicitly convert them设置为略有不同的数据类型,例如精度受限的时间戳:

select cast(to_timestamp('2017-12-02 05:00:00.123', 'YYYY-MM-DD HH24:MI:SS.FF3') as timestamp(0))
from dual;

CAST(TO_TIMESTAMP('2017-12-0
----------------------------
02-DEC-17 05.00.00.000000000

(由我的客户使用我的NLS设置显示!),或者您可以根据您正在进行的计算类型转换为日期 - 您可能已经隐含地这样做了。 Oracle date具有与timestamp(0)相同的精度,因为它们都可以保存定义到第二个的值,但它们的存储方式不同。

如果您将日期与时间戳进行比较,那么Oracle将FileAPI,这可能会影响其使用索引的能力。