2013-04-18 6 views
0

У меня есть следующий кодЗаказывайте в T-SQL

SELECT 
    CASE WHEN @ID = 1 THEN CONVERT(nvarchar(10), [insert_date],101) 
     ELSE CONVERT(nvarchar(10), [insert_date],103) 
    END AS [insert_date] 
FROM Dates 
ORDER BY [insert_date] DESC 

Теперь, когда дата в формате 101, он выводит в MM/DD/YYYY и порядка является правильным (DESC в месяц), но когда дата находится в формате 103, она выводится в формате DD/MM/YYYY, а порядок - INCorrect (DESC в день).

Как я могу заказать его по месяцу, даже если дата указана в формате DD/MM/YYYY?

Спасибо

+2

Почему ваш выход в определенном формате на всех ? Сделайте это на уровне презентации, прекратите делать T-SQL своим передним префиксом. Для этого нужен передний конец. –

+0

Спасибо, ребята, почти все решения работают. (код, который я опубликовал, был очень упрощенной версией моего кода. Эти перечисленные решения работают. @AaronBertrand, у меня не так много опыта с интерфейсом (.net/C#), чтобы справиться с ним на этом этапе. :) может быть Легко, если я просто осмотрюсь ... что я сейчас буду. :) – 007

+1

Да в C# посмотрите на '.Format()' - гораздо лучше сделать это там, чем в SQL, * особенно *, если сортировать по дате. –

ответ

3
SELECT 
CASE WHEN @ID = 1 THEN CONVERT(nvarchar(10), [insert_date],101) 
    ELSE CONVERT(nvarchar(10), [insert_date],103) 
END AS [insert_date] 
FROM Dates 
ORDER BY CONVERT(nvarchar(10), [insert_date],101) DESC 
+0

, так как это 2008 год, вместо этого я использовал бы тип даты. В противном случае это решение. – RandomUs1r

2

Попробуйте это: -

order by datepart(month,[insert_date]) desc 
1

попробуйте использовать формат 112

ВЫБЕРИТЕ случай, когда @ID = 1 THEN CONVERT (NVARCHAR (10), [insert_date], 101) ELSE CONVERT (nvarchar (10), [insert_date], 103) END AS [insert_date] FROM Dates ORDER BY CONVERT (nvarchar (1) 0), [insert_date], 112) DESC

1

вы имели в виду использовать [insert_date] и как ваше входное имя столбца, а в качестве имени столбца вывода вычисляется? Непонятно, но (как подтверждается Jermy в комментариях) это означает, что вы переопределяете значение, используемое в статье ORDER BY. Это то, что вы хотите?

Вам действительно не нужно заказывать даты по их строковому представлению, если вы не можете гарантировать, что они находятся в лексически сортируемом формате (например, yyyy-MM-dd). И если у вас нет действительно большой причины для этого, вы должны просто сортировать по самой дате. Не конвертируйте его в nvarchar.

+0

это прекрасно работает в t-sql по заказу. – RandomUs1r

+1

@Matt Johnson - используя [insert_date] для имени источника и имени псевдонимов, не вызывает ошибки в SQL Server 2008 R2. Это совершенно законная конструкция. Я согласен с вами, хотя OP, вероятно, не пытается получить результат, как указано - я бы предположил, что они просто пытаются получить даты всегда в порядке убывания. – JeremyDWill

+0

@JeremyDWill - Действительно? Я должен это проверить. Итак, каков же эффект? Он заменяет исходную колонку? Создать второй столбец с тем же именем? Использует ли в предложении ORDER BY исходное значение таблицы или имя вычисленного столбца? –

1

Если вы действительно хотите, чтобы заказ использовался месяц независимо от года (т. Е. Сохраняйте все записи за январь за несколько лет), используйте это решение @Indoknight.

Если вы на самом деле просто хотите, чтобы результаты упорядочены по дате по убыванию, независимо от даты форматирования, а затем включить имя таблицы в рамках заказа по:

SELECT 
CASE WHEN @ID = 1 THEN CONVERT(nvarchar(10), [insert_date],101) 
    ELSE CONVERT(nvarchar(10), [insert_date],103) 
END AS [insert_date] 
FROM DateTest 
ORDER BY DateTest.[insert_date] DESC