2010-12-07 5 views
0

J'ai deux colonnes dans la table datetime de notre fuseau horaire avec, en tenant compte de l'heure d'été, c drapeau de l'heure d'été. J'ai la commande par tous les jours (ordre par date-heure), et commande par pour changer l'heure de l'été à l'hiver (commande par le drapeau desc, datetime). par conséquent, je veux voir l'ordre de sélection par datetime mais dans le jour de l'ordre changeant de temps par le drapeau desc, datetime. puis-je faire une seule requête sans procédure stockée, curseurs, vue?sql problèmes avec le tri

Répondre

0

J'interprète votre exemple comme suit:

Trier par date (pas le temps) croissant.
La plupart du temps - temps asecending
10/31 (et im deviner un jour au printemps?) - drapeau desc, temps ascendng

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

Où DATEPART (dy, X), est un tsql pour ce jour sans l'année. Si je me trompe, ou si vous voulez le rendre universel, vous pouvez simplement faire du CONCAT le MOIS et le JOUR entre autres choses.

Vous avez laissé de la place pour l'interprétation dans le cas du 'Most days' (puisque dans votre exemple, toutes les dates avec le flag sont strictement plus importantes que toutes celles sans). mais vous pouvez changer cela mais vous avez besoin

(fonctions TIME ne font aucune différence fonctionnelle puisque nous savons dates sont égales à chaque fois que cette question est importante de comparaison. Je les ai mis pour plus de clarté)

+0

en jour le ressort tout va normalement je travaille sur microsoft sql server qui n'ont pas de fonction date() aussi la syntaxe de cas dans 'order by' dans t-sql est difficile à comprendre pour moi. jours de changement stockés dans la base de données (il est juste dimanche dernier de novembre je ne peux pas penser que l'expression dans t-sql et je crée la table.) puis-je faire requête après quand? – Xaver

0

select * d'un me donne quelque chose comme ç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 

je veux voir quelque chose comme ceci:

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

Et quelle est exactement la différence entre les deux listes ?? Ils me ressemblent beaucoup ...... –

+0

désolé, je modifie quelques-uns – Xaver

0

Fondamentalement, vous avez besoin de normaliser le temps; la clause ORDER BY ci-dessous supprime l'heure associée à l'heure d'été. Si votre Colum dst est en fait un peu, vous devrez peut-être convertir en un tinyint (soit dans votre conception ou en ligne dans la clause ORDER BY pour faire ce travail.

USE 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)