我有一个包含 2 列时间戳数据类型的表,start_time
并且end_time
. 格式类似于'2013-5-19 09:00:00'。
当用户输入日期时,它将类似于2013-5-19。如何获得用户输入日期的最大值?
Select max(end_time) from appointment
where ...
您使用日期切断时间trunc(date)
因此,如果您想要给定日期的最大时间戳,您可以
SELECT MAX(end_date)
FROM appointment
WHERE TRUNC(end_date) = to_date('19-05-2013','DD-MM-YYYY') -- <<< users input
您应该得到MAX(end_time)
并且只得到给定日期内的记录。
这是一个有效的 SQL Fiddle。
或者你可以试试这个:
create table appointment(start_time date, end_time date);
INSERT INTO appointment(start_time, end_time)
VALUES (TO_DATE('2013-5-19 09:00:00', 'yyyy-mm-dd HH24:MI:SS'),
TO_DATE('2013-5-19 11:00:00', 'yyyy-mm-dd HH24:MI:SS'));
SELECT start_time, end_time FROM appointment;
SELECT MAX(end_time) FROM appointment
WHERE TO_CHAR(end_time,'yyyy-mm-dd')=
TO_CHAR(TO_DATE('2013-5-19', 'yyyy-mm-dd'),'yyyy-mm-dd');
在 WHERE 子句中使用诸如 TRUNC 之类的函数可能不会让优化器使用该列上的索引(当然,除非您有针对该特定函数和列的基于函数的索引)。我发现在与此类似的情况下,我需要查找表中与特定日期匹配的所有行(仅提供日期组件 YYYY、MM 和 DD),可以使用范围比较:
DECLARE
dtSome_date DATE := TO_DATE('19-MAY-2013', 'DD-MON-YYYY');
BEGIN
FOR aRow IN (SELECT *
FROM APPOINTMENT e
WHERE e.END_TIME BETWEEN dtSome_date
AND dtSome_date + INTERVAL '1' DAY - INTERVAL '1' SECOND)
LOOP
...whatever...
END LOOP;
END;
分享和享受。