有没有办法只从时间戳中提取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格式怎么办?感谢
答案 0 :(得分:0)
你的问题确实没有意义,但我理解你为什么这么问。
基本上,你说的是“我有这个字符串"1"
但是当我将它解析为数字时,它在小数点后面有大量的数字:1.0000000000000
。如何在没有这些额外的情况下存储它零“
答案是,你不能:1
和1.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
可能是0
,01-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,这可能会影响其使用索引的能力。