结合日期和时间,获得最新的日期时间

时间:2016-06-02 11:04:51

标签: sql oracle date datetime

我有一个给定的oracle表:

enter image description here

DatumDATEZeitVARCHAR2

我必须将它们组合到一个日期并获得它们的最大(=最新)日期。我用c#中的oracle reader读取它并将它们组合起来但是为此我必须加载所有行然后搜索max:

DateTime Tempdate = new DateTime(); Tempdate = Convert.ToDateTime(reader.GetValue(0).ToString()); Tempdate = Tempdate.AddHours(Convert.ToDateTime(reader.GetValue(1).ToString()).Hour); Tempdate = Tempdate.AddMinutes(Convert.ToDateTime(reader.GetValue(1).ToString()).Minute); Tempdate = Tempdate.AddSeconds(Convert.ToDateTime(reader.GetValue(1).ToString()).Second);

如何在sql语句中完成此操作以便我只获得具有最新日期的行?

2 个答案:

答案 0 :(得分:2)

您可以使用the to_dsinterval() function将时间字符串添加到日期中,并将其前置为零天数(因此它是有效的 sql_format ):

select datum, zeit, datum + to_dsinterval('0 ' || zeit)
from your_table:

DATUM               ZEIT     DATUM+TO_DSINTERVAL('0'||ZEIT)
------------------- -------- ------------------------------
2016-01-13 00:00:00 13:22:30 2016-01-13 13:22:30           
2016-01-13 00:00:00 13:26:30 2016-01-13 13:26:30           
2016-01-13 00:00:00 13:27:30 2016-01-13 13:27:30           
2016-01-13 00:00:00 13:28:30 2016-01-13 13:28:30           
2016-01-13 00:00:00 13:29:30 2016-01-13 13:29:30           
2016-01-13 00:00:00 13:30:30 2016-01-13 13:30:30           
2016-01-13 00:00:00 13:31:30 2016-01-13 13:31:30    

然后,您只需对该计算值使用max()

select max(datum + to_dsinterval('0 ' || zeit))
from your_table;

MAX(DATUM+TO_DSINTERVAL('0'||ZEIT))
-----------------------------------
2016-01-13 13:31:30                

要获得匹配的行,您可以这样做:

select datum, zeit --, other columns
from your_table
where datum + to_dsinterval('0 ' || zeit) = (
  select max(datum + to_dsinterval('0 ' || zeit))
  from your_table
);

虽然必须两次击中表格,但您可以通过CTE避免这种情况。

您还可以使用分析排名功能,按日期和时间排序:

select datum, zeit,  -- other columns,
  dense_rank() over (order by datum desc, zeit desc) as rnk
from your_table;

DATUM               ZEIT            RNK
------------------- -------- ----------
2016-01-13 00:00:00 13:31:30          1
2016-01-13 00:00:00 13:30:30          2
2016-01-13 00:00:00 13:29:30          3
2016-01-13 00:00:00 13:28:30          4
2016-01-13 00:00:00 13:27:30          5
2016-01-13 00:00:00 13:26:30          6
2016-01-13 00:00:00 13:22:30          7

选择排名第1的行:

select datum, zeit --, other columns
from (
  select t.*, dense_rank() over (order by datum desc, zeit desc) as rnk
  from your_table t
)
where rnk = 1;

DATUM               ZEIT   
------------------- --------
2016-01-13 00:00:00 13:31:30

如果您从问题建议的行中获取其他数据,那么如果您可能有两行具有相同的日期和时间,则需要决定如何断开关系并选择其中一个。

答案 1 :(得分:2)

您可以在时间组件上使用TO_DATE()

SELECT datum + ( TO_DATE( zeit, 'HH24:MI:SS' ) - TRUNC( TO_DATE( zeit, 'HH24:MI:SS' ) ) )
FROM   table_name

然后为了获得最大值,您可以在此计算值上使用MAX(),或者,可以使用它们的日期/字母数字排序来比较值(假设时间组件不会超过{{1}你可以找到最大值:

23:59:59

这可以使用您在桌面上的任何索引。

然后在这一行上使用我的第一个查询(或@ AlexPoole的SELECT datum, zeit FROM ( SELECT datum, zeit, ROW_NUMBER() OVER ( ORDER BY datum DESC, zeit DESC ) AS rn FROM table_name ) WHERE rn = 1 解决方案)。