我有一个给定的oracle表:
列Datum
为DATE
,Zeit
为VARCHAR2
。
我必须将它们组合到一个日期并获得它们的最大(=最新)日期。我用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语句中完成此操作以便我只获得具有最新日期的行?
答案 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
解决方案)。