2013-04-25 2 views
1

База данных, к которой я обращаюсь, имеет таблицу пользователя с столбцом, содержащим дату, которую пользователь зарегистрировал для веб-сайта.Как упорядочить по дате, когда столбец не отформатирован?

дата вводится в столбец VARCHAR без надлежащего форматирования даты, как это:

Apr 18 2013 12:27PM 

Когда я SELECT MAX (dateColumn) я получаю значение примерно на полпути через диапазон дат. Я рассмотрел использование подстрок, чтобы захватить год, затем месяц, затем дату и упорядочить их последовательно. Проблема заключается в том, что даты с днями, начиная с 0 будет укоротить на один символ, как это:

May 1 2013 12:27PM 

Есть простой способ найти самую высокую дату, без изменения структуры базы данных?

+2

Вы не должны хранить даты в столбце varchar. И ваша проблема является прямым результатом этой ошибки. Я настоятельно рекомендую изменить столбец на реальный «DateTime» и перенести данные. –

+0

Да, к сожалению, это не я сделал сайт/db. Поскольку уже есть 200 пользователей, я не могу изменить базу данных. – blarg

+2

Конечно, вы можете. Добавьте новый столбец, перенесите данные из старого столбца в новый столбец. Отбросьте старый столбец. Откорректируйте свое приложение. Это стандартная миграция схемы (которую вы должны иметь в любом случае), и количество пользователей не имеет к этому никакого отношения. –

ответ

2

Попробуйте select max(convert(datetime, dateColumn, 109))

Дополнительная информация о преобразовании между типами данных в SQLServer (в том числе форматов даты) here.

+0

Что означает 109? – blarg

+0

@JackDamery: третий аргумент - это формат, используемый при преобразовании из поля символов в поле даты; 109 означает mon dd yyyy hh: mi: ss: mmmAM (или PM) - вместо этого вы также можете использовать 100. Вы можете увидеть полный список форматов дат и дополнительную информацию о преобразовании между типами данных здесь: http://msdn.microsoft.com/en-us/library/ms187928%28v=sql.90%29.aspx –

0

Включить колонку, чтобы иметь значения в формате «YYYYMMDD», а затем отсортировать эту колонку.

0

Попробуйте преобразовать формат varchar в формат datetime и сделать. Вы должны сохранить дату в том же формате. Его просто пример для преобразования varchar в datetime.

Select * from tblName 
    where Convert(datetime, Convert(varchar(12),DOJ,106)) as DOJ >= 
      Convert(datetime, Convert(varchar(12),'2013-04-28',106)) 
Смежные вопросы