我只有一个日期时选择一个时间戳?

时间:2013-05-19 05:26:51

标签: sql oracle

我有一个包含2列时间戳数据类型start_timeend_time的表。格式类似于'2013-5-19 09:00:00'

当用户输入日期时,它将类似于 2013-5-19 。如何获得用户输入日期的最大值?

Select max(end_time) from appointment
where ...

3 个答案:

答案 0 :(得分:1)

您使用trunc(date)

来截断日期中的时间

因此,如果您想要某一天的最大时间戳,您可以

SELECT MAX(end_date)
  FROM appointment
 WHERE TRUNC(end_date) = to_date('19-05-2013','DD-MM-YYYY') -- <<< users input

答案 1 :(得分:1)

您应该获得MAX(end_time)并且只获取给定日期内的记录。

这是working 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');

答案 2 :(得分:1)

在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;

分享并享受。