проблемы с сортировкой - PullRequest
       2

проблемы с сортировкой

0 голосов
/ 07 декабря 2010

У меня есть две колонки в таблице datetime нашего часового пояса с учетом летнего времени, c флагом летнего времени.У меня есть заказ на все дни (заказ по дате и времени) и заказ на изменение времени с лета на зиму (заказ по флагу desc, datetime).В результате я хочу видеть порядок выбора по дате и времени, но в день изменения порядка по времени по флагу desc, datetime.Могу ли я сделать один запрос без хранимой процедуры, курсоров, просмотра?

Ответы [ 3 ]

0 голосов
/ 07 декабря 2010

выбор * из дает мне что-то вроде этого:

2010-03-28 00:47:42 0
2010-03-28 01:27:42 0
2010-03-28 03:17:42 1
2010-03-28 05:20:42 1
2010-03-28 07:20:42 1
2010-10-31 00:35:20 1
2010-10-31 01:10:20 1
2010-10-31 02:04:20 0
2010-10-31 02:05:20 0
2010-10-31 02:07:20 0
2010-10-31 02:09:20 0
2010-10-31 02:10:20 1
2010-10-31 02:13:20 0
2010-10-31 02:18:20 0
2010-10-31 02:20:20 1
2010-10-31 02:40:20 1
2010-10-31 03:24:20 0
2010-12-01 11:08:19 0

Я хочу увидеть что-то вроде этого:

2010-03-28 00:47:42 0
2010-03-28 01:27:42 0
2010-03-28 03:17:42 1
2010-03-28 05:20:42 1
2010-03-28 07:20:42 1
2010-10-31 00:35:20 1
2010-10-31 01:10:20 1
2010-10-31 02:10:20 1
2010-10-31 02:20:20 1
2010-10-31 02:40:20 1
2010-10-31 02:04:20 0
2010-10-31 02:05:20 0
2010-10-31 02:07:20 0
2010-10-31 02:09:20 0
2010-10-31 02:13:20 0
2010-10-31 02:18:20 0
2010-10-31 03:24:20 0
2010-12-01 11:08:19 0
0 голосов
/ 10 декабря 2010

В основном вам нужно стандартизировать время; В приведенном ниже предложении ORDER BY удаляются часы, связанные с переходом на летнее время. Если ваш dst colum на самом деле немного, вам может потребоваться преобразовать его в tinyint (либо в вашем дизайне, либо в строке в предложении ORDER BY, чтобы это работало.

ИСПОЛЬЗОВАТЬ tempdb

DECLARE @T TABLE (dt DATETIME, c tinyint)
INSERT INTO @t 
VALUES ('2010-03-28 00:47:42', 0) 
,('2010-03-28 01:27:42', 0) 
,('2010-03-28 03:17:42', 1) 
,('2010-03-28 05:20:42', 1) 
,('2010-03-28 07:20:42', 1)
,('2010-10-31 00:35:20', 1) 
,('2010-10-31 01:10:20', 1) 
,('2010-10-31 02:04:20', 0) 
,('2010-10-31 02:05:20', 0) 
,('2010-10-31 02:07:20', 0) 
,('2010-10-31 02:09:20', 0) 
,('2010-10-31 02:10:20', 1) 
,('2010-10-31 02:13:20', 0) 
,('2010-10-31 02:18:20', 0) 
,('2010-10-31 02:20:20', 1) 
,('2010-10-31 02:40:20', 1) 
,('2010-10-31 03:24:20', 0) 
,('2010-12-01 11:08:19', 0)

SELECT Dt, c 
FROM @t
ORDER BY DATEADD(HOUR, -c, Dt)
0 голосов
/ 07 декабря 2010

Я интерпретирую ваш пример следующим образом:

Сортировка по возрастанию по ДАТЕ (не по времени).
Большинство дней - по возрастанию по времени
10/31 (и я предполагаю, что один день весной?)- флаг c desc, time ascendng

ORDER BY DATE(datefield), (CASE DATEPART(dy, datefield) WHEN '10/31' THEN c DESC, TIME(datefield) ELSE TIME(datefield) END) 

Где DATEPART (dy, X), это tsql для даты без года.Если я не прав или вы хотите сделать его универсальным, вы можете просто сделать КОНКАТ в МЕСЯЦ и ДЕНЬ среди прочего.

Вы оставили некоторую комнату для устного перевода по делу «Большинство дней» (так как в вашемНапример, все datetime с флагом строго больше, чем у всех без).но вы можете изменить это так, как вам нужно

(функции TIME не имеют функциональной разницы, поскольку мы знаем, что даты равны, когда это сравнение имеет значение. Я приведу их для ясности)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...