2010-12-07 51 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)