Member 13194079 Ответов: 3

Дата сортировки, которая хранится в виде текстового типа


Hello

I want to sort Date which was stored as Text Type.
It looks like "11/23/2016"
I need sql command to sort using this field

IncorpDate is stored as Text Type not Date Type, "11/23/2016"

sqlString = "SELECT * FROM CustomerTable ORDER BY cast(IncorpDate as DATETIME) Asc"
it is not working

I tried the following
sqlString = "SELECT * FROM CustomerTable ORDER BY Convert(DATETIME, IncorpDate, 101) Asc"

it is not working. It generates an error message which is "Undefined Function "Convert" in expression.

Please help
Thank you in advance.


Что я уже пробовал:

sqlString = "SELECT * FROM CustomerTable ORDER BY cast(IncorpDate as DATETIME) Asc"


sqlString = "SELECT * FROM CustomerTable ORDER BY Convert(DATETIME, IncorpDate, 101) Asc"

3 Ответов

Рейтинг:
13

OriginalGriff

В принципе, у вашего дизайна БД есть серьезная проблема, и вы должны исправить ее, а не пытаться обойти ее.

Всегда храните данные в соответствующих типах данных - и это означает, что только строковые данные хранятся в Столбцах VARCHAR или NVARCHAR. Если вы этого не сделаете то получите две проблемы:
1) порядок сортировки не работает, а это значит, что сравнения тоже не работают. Вы заметили это, и это не та ситуация, которая станет лучше. Бодинг вокруг него также неэффективен и потребляет много кода.
2) в какой - то момент - а это, возможно, уже произошло без вашего ведома-будут введены плохие данные. Это может быть дата американского формата, как вы показываете, или европейский формат 23/11/2016, или ISO 2019/11/23, или просто 01/02/03, который вы не можете решить, какая это дата: 1 февраля 2003 года, 2 января 2003 года или 3 февраля 2001 года? Или... имя ребят, "сдсдсдс" или любой другой текст. Когда это происходит, либо ваша база данных недействительна и требует значительной человеческой работы для исправления. И один-единственный ввод данных без даты приведет к сбою вашего кода bodged ...

Поэтому перестаньте пытаться преобразовать его и измените базу данных и код, который вводит в нее данные: проверьте и преобразуйте свои даты на языке презентации, передайте преобразованные данные в SQL с помощью параметризованного запроса и сохраните их в столбце DATE, DATETIME или DATETIME2.
Все эти проблемы сразу уходят.


Member 13194079

Спасибо Вам за ваше решение

Рейтинг:
1

MadMyche

Ну, ваша настоящая проблема заключается в том, что таблица базы данных использует неправильный тип данных.

Теперь, как обойти эту прошлую ошибку в суждении... Я хотел бы использовать псевдоним столбца в предложении Select и сортировка на новое имя

SELECT   *, FixedDate = Cast(IncorpDate as DateTime) -- or your Convert statement
FROM     CustomerTable
ORDER BY FixedDate Asc


Рейтинг:
1

Member 13194079

Спасибо вам всем за помощь.

Я попробую изменить БД
Спасибо еще раз.