1

我有一个包含 2 列时间戳数据类型的表,start_time并且end_time. 格式类似于'2013-5-19 09:00:00'

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

Select max(end_time) from appointment
where ...
4

3 回答 3

1

您使用日期切断时间trunc(date)

因此,如果您想要给定日期的最大时间戳,您可以

SELECT MAX(end_date)
  FROM appointment
 WHERE TRUNC(end_date) = to_date('19-05-2013','DD-MM-YYYY') -- <<< users input
于 2013-05-19T07:42:05.000 回答
1

您应该得到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');
于 2013-05-19T07:43:21.887 回答
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;

分享和享受。

于 2013-05-19T12:40:37.247 回答