2010-12-07 70 views
0

我有我們的時區表日期時間兩列,考慮到夏令時,夏令時c標誌。我按順序排列所有日期(按日期排序),並按順序排序,從夏季到冬季更改時間(按國旗desc,datetime排序)。因爲我希望按日期時間查看選擇順序,但是通過標誌desc,datetime改變時間順序。我可以做一個查詢沒有存儲過程,遊標,視圖?SQL與排序的問題

回答

0

我理解你的例子如下:

按日期排序(不是時間)上升。
大多數日子 - 時間asecending
10/31(和IM春季猜測在一起?) - 標誌C遞減,時間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沒有一年。如果我錯了,或者你想讓它通用,你可以在MONTH和DAY之間做CONCAT等等。

在「大多數日子」的情況下,您留下了一些解釋空間(因爲在您的示例中,所有帶有國旗的日期時間嚴格大於沒有日期的日期)。但你可以改變但是你需要

(TIME功能作出任何功能上的區別,因爲我們知道日期是平等的,只要這種比較的問題。我把他們的清晰度)

+0

在天春天一切正常我在微軟的SQL服務器上沒有一個日期()函數也在'順序'的情況下,在t-sql語法很難理解爲我。在desc以後,以防萬一結束是必要的。更改存儲在數據庫中的天(這只是11月的最後一個星期日,我不能認爲t-sql中的表達式和我創建表)。我可以在什麼時候查詢? – Xaver 2010-12-07 06:51:28

0

的SELECT * FROM一個給我這樣的事情:

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

這兩個列表之間的區別究竟是什麼?他們看起來和我一樣...... – 2010-12-07 05:58:22

0

基本上,你需要規範的時間;下面的ORDER BY子句刪除與夏令時相關的小時。如果您的DST式柱其實是有點,你可能需要將其轉換爲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)