2016-06-01 180 views
1

如何将时间戳转换为日期?在Oracle SQL中将日期转换为时间戳

表中有一个字段,start_ts这是timestamp格式:

'05/13/2016 4:58:11.123456 PM' 

我需要查询表,并找出最大和最小的表timestamp,但我不能。

Select max(start_ts) 
from db 
where cast(start_ts as date) = '13-may-2016' 

但查询没有返回任何值。

请帮我找到日期的最大时间戳。

+0

见的许多其他问题,一个关于日期比较时间戳,如这一个:http://stackoverflow.com/questions/30519823/compare-date-in-sql-command – Turophile

+0

_real_ timestamp列没有“格式”。你为什么把它存储为一个字符串? –

回答

0

尝试使用TRUNCTO_DATE代替

WHERE 
    TRUNC(start_ts) = TO_DATE('2016-05-13', 'YYYY-MM-DD') 

或者,你可以使用>=<来避免在start_ts柱使用的功能:

WHERE 
    start_ts >= TO_DATE('2016-05-13', 'YYYY-MM-DD') 
    AND start_ts < TO_DATE('2016-05-14', 'YYYY-MM-DD') 
+0

我试过使用这个,但由于时间戳包含AM/PM与毫秒,它不返回任何值。 – Dinu

0

使用这种格式,而选择

to_char(systimestamp,'DD-MON-YYYY') 

例如:

从dual中选择to_char(systimestamp,'DD-MON-YYYY');

-2

这可能不是正确的做法。但我已经使用子字符串函数解决了这个问题。

Select max(start_ts), min(start_ts)from db where SUBSTR(start_ts, 0,9) ='13-may-2016' 

使用此我能够检索最大和最小时间戳。

2

如果数据类型是时间戳,那么可见格式是不相关的。

您应该避免将数据转换为日期或使用to_char。相反,比较使用TO_TIMESTAMP()的时间戳数据的时间戳值

WHERE start_ts >= TO_TIMESTAMP('2016-05-13', 'YYYY-MM-DD') 
    AND start_ts < TO_TIMESTAMP('2016-05-14', 'YYYY-MM-DD') 
+0

如果表格包含多个日期的数据并且该表格没有任何日期字段。日期使用时间戳字段标识。那么我们如何才能找到特定日期的最大和最小时间戳? – Dinu

+0

MIN和MAX仍然可以使用时间戳。此数据类型只是存储日期和时间的非常准确的方式 –

+0

是的,我同意。我们可以找到当天的最大时间戳,但我们如何才能找到最新日期的最小时间戳。如果我们从db中使用select min(start_ts),那么它将返回表中存在的最小时间戳。它不会是最新日期的最小时间戳。由于日期列缺失,我们如何才能找到最新日期的最小时间戳。 – Dinu

2
CAST(timestamp_expression AS DATE) 

例如,查询是:SELECT CAST(SYSTIMESTAMP AS DATE) FROM dual;