2015-11-12 2 views
3

Я использую Oracle sql developer. И я должен классифицировать некоторые данные в каждом Date из таблицы.Как классифицировать данные для каждой даты в sql?

Я использовал TO_CHAR функцию для изменения формата даты.

select to_char(txn_date, 'dd-mon-rrrr') my_day, some_coloums 
from mwt_wallet_transactions 
order by my_day; 

Это нормально с верхним. Но я хочу, чтобы получить его с определенной даты, как это:

select to_char(txn_date, 'dd-mon-rrrr') my_day, some_coloums 
from mwt_wallet_transactions 
where my_day like '08-feb-2015' 
order by my_day; 

Я искал это через Интернет, большинство из них попросили использовать CONVERT функцию:

select convert (VARCHAR(10), txn_date , 23) my_day, some_colomns 
from mwt_wallet_transactions 
where my_day like '08-feb-2015' 
order by my_day; 

Но это не работа для меня. Помогите мне решить это!

+1

ORDER BY перед тем WHERE ... Переключите место ... И вам нужна производная таблица. – jarlh

+1

Что дало вам идею использовать 'LIKE'? Я вижу это снова и снова, и я всегда удивляюсь, почему люди так часто используют его, когда хотят сравнить только точные значения. Есть ли причина, по которой вы не использовали 'where my_day = '08 -feb-2015''? Вы ожидаете, что 'LIKE' сделает что-то здесь, что' = 'не делает? –

+3

@ThorstenKettner "* Есть ли причина, по которой вы не использовали, где my_day = '08 -feb-2015 '*" Но это будет сравнивать дату со строкой. ** DATE ** и ** STRING ** не совпадают. ''08 -feb-2015'' - это строка, а не дата. –

ответ

6

где my_day как '08 -feb-2015'

Я думаю, что вы запутались между ВЫБОРА и ФИЛЬТР предиката.

Кроме того, помните, ''08-feb-2015' НЕ ДАТА, это строка.

Вы хотите отфильтровать строки на основе значения DATE. Итак, конвертируйте литерал на R.H.S. в DATE с использованием TO_DATE или использовать ANSI Дата буквально, если у вас нет временной части.

Теперь, помните, DATE имеет как элементы даты и времени, так что вам нужно -

  • либо использовать TRUNC на колонке даты, чтобы избавиться от времени элемент
  • или используйте DATE диапазон состояние до изначальный выступление как было бы любой стандартный индекс на колонке с цифрами.

Я принимаю my_day как столбец даты. Изменить фильтр как:

Использование ANSI Дата буквальным: фиксированный формат 'YYYY-MM-DD'

where my_day >= DATE '2015-02-08' and my_day < DATE '2015-02-09' 

Или TO_DATE с правильной моделью формата . Помните, TO_DATE is NLS зависит, поэтому я использовал NLS_DATE_LANGUAGE, чтобы сделать его независимым от NLS.

WHERE my_day >= TO_DATE('08-feb-2015','dd-mon-yyyy','NLS_DATE_LANGUAGE=american') 
AND my_day < TO_DATE('09-feb-2015','dd-mon-yyyy','NLS_DATE_LANGUAGE=american') 

Выше. my_day считается столбцом статической даты, а не псевдонимом столбца.

+1

Я думаю, что очень жаль, что Oracle вызывает этот тип DATE, хотя у него есть временная часть. DATETIME было бы более подходящим именем, и было бы здорово иметь * дополнительный * тип DATE для дат без временной части. Однако, как бы то ни было, но с именем столбца 'txn_date', я бы ожидал, что это * будет * датой, т. Е. Существует ограничение' txn_date = trunc (txn_date) 'или даже соответствующее перед триггером вставки/обновления в этой колонке. Тогда просто «txn_date = date'2015-02-08» будет работать нормально. –

+0

Спасибо вам обоим, @thorstenKettner, "txn_date = date'2015-02-08 '" не работает. Лучше использовать «cast (txn_date as DATE) my_day» или «cast (txn_date as VARCHAR) my_day "? –

+1

Что вы подразумеваете под "txn_date = date'2015-02-08" не работает? Вы получаете сообщение об ошибке или получаете неправильные результаты? CAST не требуется. Какой тип данных является txn_date? Мы предполагали, что это будет DATE, и поэтому вы должны быть в состоянии сравнить с датой '2015-02-08 ', которая, конечно же, будет 8 февраля 2015 г. У ваших значений для этого столбца есть временные части (т. Е. Вы получаете строки при выборе 'select * from from mwt_wallet_transactions где txn_date <> trunc (txn_date) '? –

0

Вы не можете использовать псевдонимы списка избранных списков в предложении WHERE. Используйте полученную таблицу для доступа к нему:

select * from 
(
select *some_computed_value* as my_day, some_colomns 
from mwt_wallet_transaction 
) 
where *my_day conditions* 
order by my_day 
+3

'convert (VARCHAR (10), txn_date, 23)' недействителен синтаксис Oracle. Кроме того, если вы хотите сравнить даты, это помогает сохранить даты как DATE, а не преобразовывать их в строки и затем сравнивать. В целом, это безопаснее, позволит использовать индексы в столбце DATE и просто имеет смысл. – Boneist

+0

Это не так? Ну, цель моего ответа - показать, как использовать псевдонимы столбцов в предложении WHERE, используя производную таблицу. Я могу удалить эту часть ... – jarlh

0

Мое решение:

Я проверил это решение, и это работает хорошо,

select * from 
(select cast(TRUNC(txn_date) as date) my_day ,some_columns 
from mwt_wallet_transactions 
) 
where my_day = '08-FEB-15' 
order by my_day 
; 

или мы можем использовать:

select * from 
(select to_char(txn_date, 'dd-mon-rrrr') my_day 
from mwt_wallet_transactions 
) 
where my_day = '08-feb-2015' 
order by my_day; 
+0

Это означает, что 'txn_date' хранится как ** строка **, а не ** DATE **? И вы никогда не говорили нам о типе данных. И это плохой дизайн, чтобы хранить даты как строки. Это решение может просто сработать для вас, но будущих читателей следует предупредить о плохом дизайне. И это всего лишь обходной путь для вашего дела. –

Смежные вопросы