2015-09-14 13 views
1

Я новичок в SQL, поэтому этот вопрос-Finding MAX значения (ДАТА) в SQL

У меня есть DATE колонки в моей таблице, и мой запрос должен получить значение с самым последним DATE. Я понял, что я могу достигнуть его через любой из следующих ways-

  1. SELECT TRUNC(MAX(createddatetm)) cdt FROM (SELECT TO_TIMESTAMP(TO_CHAR(createddate, 'Month dd, yyyy hh:mi AM'), 'Month dd, yyyy hh:mi AM') as createddatetm FROM comments WHERE commentid = '1234');

  2. SELECT trunc(MAX(TO_TIMESTAMP(to_char(createddate, 'Month dd, yyyy hh:mi AM'), 'Month dd, yyyy hh:mi AM'))) FROM (SELECT createddate FROM comments WHERE commentid = '1234');

  3. SELECT TRUNC(MAX(createddatetm)) cdt FROM (SELECT TO_CHAR(createddate, 'Month dd, yyyy hh:mi AM') as createddatetm FROM comments WHERE commentid = '1234');

  4. SELECT trunc(MAX(to_char(createddate, 'Month dd, yyyy hh:mi AM'))) FROM (SELECT createddate FROM comments WHERE commentid = '1234');

ЗДЕСЬ МОЙ ВОПРОС -
Есть ли другой простой способ, с помощью которого я могу это достичь? Или я должен использовать любую из них, которую я поддержал? Кроме того, существуют ли различия между этими запросами в отношении производительности? Я не думаю, что есть, но мне нужно это подтвердить.

ответ

7

Почему вы конвертируете дату в varchar, чтобы снова преобразовать ее в дату/временную метку? Вы можете просто сравнить/использовать значение даты, хранящееся в базе данных.

Ваша проблема может быть легко решена с помощью функции окна:

select * 
from ( 
    select c.*, 
     row_number() over (order by createddate desc) as rn 
    from comments 
    where commentid = 1234 
) t 
where rn = 1; 

в качестве альтернативы, используя max()

select * 
from ( 
    select c.*, 
     max(createddate) over() as max_createddate 
    from comments 
    where commentid = 1234 
) t 
where max_createddate = createddate; 

или, если вам нужно, что для нескольких значений CommentID:

select * 
from ( 
    select c.*, 
     row_number() over (partition by commentid order by createddate desc) as rn 
    from comments 
) t 
where rn = 1; 
+0

Причина, почему я преобразование даты в VARCHAR, чтобы преобразовать его обратно в дату/метки времени опять я хочу сравнение производится на основании даты и времени, а также, но не использовать значение для отображения? – AlwaysALearner

+1

Сравнение будет выполнено всегда с использованием значения даты/времени. Если вы хотите скрыть временную часть во время отображения, отформатируйте столбец 'date', используя' to_char() '. Но лучше получить «реальные» значения в запросе и сделать форматирование в своем приложении (передняя часть). –

0

Почему имеют вложенные операторы Select, когда вы просто ищете одно простое значение?

select trunc(max(createddate)) cdt 
from comments 
where commentid = '1234'; 
Смежные вопросы