2015-03-10 5 views
0

У меня есть таблица, которая имеет столбец CreatedDate, который имеет тип varchar(100). Строки для этого столбцов:Как преобразовать varchar на дату для заказа в SQL Server

CreatedDate 
-------------- 
March 6, 2015 
March 6, 2015 
March 6, 2015 
March 6, 2015 
March 6, 2015 
March 6, 2015 
March 7, 2015 
March 10, 2015 

Если я следующий запрос, дата не приказывать правильно:

SELECT * 
FROM [Db].[dbo].[Table1] 
ORDER BY [CD] ASC 

я вижу следующее:

CreatedDate 
--------------- 
March 10, 2015 
March 6, 2015 
March 6, 2015 
March 6, 2015 
March 6, 2015 
March 6, 2015 
March 6, 2015 
March 7, 2015 

Как Я передал столбец так, чтобы оператор упорядочения работал правильно?

+3

Строки упорядочены ** абсолютно правильно * * - для 'varchar'. Это то, что вы получаете от использования ** неправильного типа данных ** - если у вас есть дата - храните его как 'DATE' или' DATETIME2 (n) '!! См. Также: [Плохие привычки пинать: выбор неправильного типа данных] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/12/bad-habits-to-kick-using-the-wrong- data-type.aspx) - вы всегда должны использовать наиболее подходящий тип данных - вот для чего они нужны, в конце концов! –

+0

Это должен быть формат varchar для использования где-то в другом месте. Спасибо за критику :) – SearchForKnowledge

+1

Вы можете * всегда * легко конвертировать что-либо в строку - нет смысла хранить числа или даты как ** string ** ... –

ответ

1

Предполагая, что все это может быть безопасно преобразовать в дату или дату:

CAST(CD AS DATE) 

Если вы не должны были бы разделить строку и сделать его дату вручную.

+1

Благодарим за отзыв – SearchForKnowledge

+0

Простая и простая. Спасибо. – SearchForKnowledge

1

Cast Использование или Convert функции для преобразования данных varchar в Date затем использовать его в order by

SELECT * 
FROM [Db].[dbo].[Table1] 
ORDER BY Cast([CD] AS DATE) ASC 

Если вы используете собственные datatype(date) такие проблемы можно избежать.

+1

Благодарим за отзыв – SearchForKnowledge

3

Изменение ORDER BY положения для:

ORDER BY TRY_PARSE(CreatedDate AS DATE) ASC; 

Если CreatedDate столбца содержит значение, которые не являются допустимыми датами, TRY_PARSE возвращает NULL для оценки сортировки вместо того, чтобы бросить сообщение об ошибке.

Если у вас есть контроль над определением таблицы, измените тип данных столбца на DATE. Вам не придется прыгать через обручи для сортировки, недопустимые диапазоны дат будут предотвращены при вставке, и требуется меньше места.

SQLFiddle

+1

Благодарим за ответ – SearchForKnowledge

1

Try:

SELECT * 
FROM [Db].[dbo].[Table1] 
ORDER BY CONVERT(DATETIME,[CD],105) ASC 
+1

Благодарим за отзыв – SearchForKnowledge

1

Вы можете использовать функцию CONVERT со стилем 107 (107 = Mon dd, yyyy) таким образом:

DECLARE @Test TABLE (
    ColA VARCHAR(100) 
); 
INSERT @Test 
VALUES ('March 10, 2015') 
,('March 6, 2015') 
,('March 6, 2015') 
,('March 6, 2015') 
,('March 6, 2015') 
,('March 6, 2015') 
,('March 6, 2015') 
,('March 7, 2015'); 

SELECT t.ColA, CONVERT(DATE, t.ColA, 107) AS ColA_Date 
FROM @Test t 
-- ORDER BY ColA_Date 

Результаты:

ColA   ColA_Date 
-------------- ---------- 
March 10, 2015 2015-03-10 
March 6, 2015 2015-03-06 
March 6, 2015 2015-03-06 
March 6, 2015 2015-03-06 
March 6, 2015 2015-03-06 
March 6, 2015 2015-03-06 
March 6, 2015 2015-03-06 
March 7, 2015 2015-03-07 
+1

Благодарим за отзыв – SearchForKnowledge

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