sql排序问题

时间:2010-12-07 05:07:13

标签: sql-server tsql

我在时区的表日期时间有两列,考虑夏令时,夏令时的标志。我按顺序查看所有日期(按日期时间排序),并按顺序更改从夏季到冬季的时间(按标志desc,日期时间排序)。结果我希望按日期时间查看选择顺序,但是在标记desc,datetime更改时间顺序的日期。我可以在没有存储过程,游标,查看的情况下进行一次查询吗?

3 个答案:

答案 0 :(得分:0)

我将您的示例解释如下:

按日期(不是时间)递增排序   大多数日子 - 时间过去了   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。如果我错了,或者你想让它变得普遍,你可以在其他事情上做MONC和DAY的CONCAT。

你在“大多数日子”的情况下留下了一些解释空间(因为在你的例子中,所有带有标志的日期时间都严格地大于所有没有的日期)。但你可以随意改变

(TIME函数没有任何功能差异,因为只要这个比较很重要,我们就知道日期是相等的。我为了清楚起见将它们放在一起)

答案 1 :(得分:0)

select * from a给我这样的东西:

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

答案 2 :(得分:0)

基本上,你需要标准化时间;下面的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)