Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/04/2011, 00h47   #1
Invité de passage
 
Homme
Inscription : avril 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : avril 2011
Messages : 3
Points : 1
Points : 1
Par défaut [SQL SRV][DEBUTANT]Aide sur une requete

Bonjour,

J'ai quelques bonnes notions en développement PHP, mais de gros souci avec les requêtes "complexes" sous SQL Server 2005.

Ma table simplifiée : clients et dates.
Code :
1
2
3
4
5
6
7
8
9
 
SELECT  
MaTable.client
,MaTable.date
FROM MaTable
WHERE 
MaTable.client = 'LE CLIENT'
AND 
MaTable.date BETWEEN '24/01/2011' AND '26/01/2011'
Jusqu'ici tout va bien,
Je récupère tout les évènements de la journée du 24 et du 25.

Maintenant, je souhaiterais ne garder que les évènements compris entre 2 heures
et si je rajoute un malheureux :
Code :
1
2
AND
MaTable.date BETWEEN '07:30' AND '15:00'
Plus aucun résultat ...


Alors, Je l'ai tourné en :
Code :
MaTable.date > '07:30' AND MaTable.date < '15:00'
Mais pareil...

Entre 2, un petit espoir en voyant :
Code :
1
2
AND
DATEPART(hh,MaTable.date ) BETWEEN 7 AND 20
qui se met finalement à me retourner des résultats... mais pas assez précis... il me faut un 07:30 et non un 07:00

Je tente finalement en vain :
Code :
DATE_FORMAT(MaTable.date, '%Hh%imin') BETWEEN '07:30' AND '20:00'
mais la fonction DATE_FORMAT n'est pas reconnue...

Je ne sais plus ...
Le DATEPART pourrais me permettre d'extraire les heures puis les minutes ... une concaténation du genre heure+':'+minute et je pourrais lancer une comparaison, mais comment faire ceci?

Je vois également qu'il est possible d'imbriquer des requêtes.
dans les exemples ça marche toujours très bien, mais des que j'essaie ca se solde tout le temps par une erreur...

Je suis quelque peu perdu!
et les yeux qui piquent!!

Plizz Help!
DF4ze est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 07h20   #2
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
AND
MaTable.date BETWEEN '07:30' AND '15:00'
Normal que celà ne fonctionne pas puisque .date est une date avec heure... vous le comparez à des caractères donc SQL SERVER ne peut pas deviner que vous ne cherchez que l'heure mais je pense que vous l'aviez bien compris:

Citation:
AND
DATEPART(hh,MaTable.date ) BETWEEN 7 AND 20
(Sachez que DATEPART(hour,...) fait la même chose)
Vous pouvez simplement affiner avec DATEPART(minute,MaTable.date)... pour extraire les minutes.
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 21h35   #3
Invité de passage
 
Homme
Inscription : avril 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : avril 2011
Messages : 3
Points : 1
Points : 1
Bonjour,

Effectivement, j'ai bien compris que le DATEPART permettait de détailler la date,
Mais je ne vois pas comment formuler la requête pour faire la comparaison?

je vois 2 options :
- Soit je compare séparément:
Code :
1
2
3
Heure BETWEEN heure1 AND heure2
AND
min BETWEEN min1 AND min2
Mais sincèrement je ne l'ai pas testée car ca va obligatoirement sortir n'importe quoi...!

- Comparer simultanément, du genre :
Code :
DATEPART(hh, MaTable.date)+':'+DATEPART(hh, MaTable.date) BETWEEN '07:30' AND '20:00'
là j'avoue j'ai testé!
et ca me sort une jolie erreur de type.

J'ai donc 'casté' tout ca du genre :
Code :
CAST(DATEPART(...))+...
Mais évidemment rien n'est sorti!

... et c'est en écrivant ce post que je me suis dit :
Tu as casté vers le varchar ... pourquoi pas tenter dans l'autre sens?

et la ... miracle!

Code :
(DATEPART(hh,MaTable.date)+(DATEPART( mi,MaTable.date )/100)) BETWEEN 5 AND 5
et bien ca marche!

Je m'explique
dans la requete, J'additionne l'heure avec les minutes/100, ca me fait donc un chiffre qui va aller de 0 à 23.59

Mais oui! entre 5 et 5 ... il me trouve des résultats! Bug?

Comment de 5.00 jusqu’à 5.59, SQL peut-il dire que c'est entre 5 et 5...??
--> seule réponse que je vois c'est qu'il l'a rangé par ordre alphabétique??

...et avant il m'embêtait avec une histoire de type?!!

Enfin bon, plus qu'a retoucher le petit bug avec un peu de code derrière mais ca va largement me faciliter la tache.

Comme quoi, merci pour ton intervention iberserk

code complet:
Code :
1
2
3
4
5
6
7
8
9
10
SELECT  
MaTable.client
,MaTable.date
FROM MaTable
WHERE 
MaTable.client = 'LE CLIENT'
AND 
MaTable.date BETWEEN '24/01/2011' AND '26/01/2011'
AND
(DATEPART(hh,MaTable.date)+(DATEPART( mi,MaTable.date )/100)) BETWEEN 5 AND 5
DF4ze est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 22h29   #4
Membre éprouvé
 
Homme Hamid MIRA
Ingénieur développement logiciels
Inscription : septembre 2003
Messages : 177
Détails du profil
Informations personnelles :
Nom : Homme Hamid MIRA
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2003
Messages : 177
Points : 413
Points : 413
Ta solution me parait incompréhensible et hasardeuse !

Ci-dessous une solution utilisant la notation normalisée ISO8601 :
aaaa-mm-jjThh:mi:ss.mmm

Exemple : Evennements entre 07:30 et 15:00

Code :
1
2
3
.... 
AND  ( CONVERT(DATETIME, CONVERT(CHAR(12), MaTable.date , 114), 114)
       BETWEEN '1900-01-01T07:30:00.000' AND  '1900-01-01T15:00:00.000' )
Remarque : char(12) est utilisé pour le format de conversion 114 , c.à.d hh:mi:ss:mmm (sur 24h)
A+
hmira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 07h56   #5
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
(DATEPART(hh,MaTable.date)+(DATEPART( mi,MaTable.date )/100)) BETWEEN 5 AND 5

Le problème viens du fais que tu divises... d'où forcement problème d'arrondies.

En restant en seconde (heures*60+ secondes) tu n'aurais pas eu le soucis...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 11h40   #6
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

Citation:
Envoyé par DF4ze Voir le message
Je m'explique
dans la requete, J'additionne l'heure avec les minutes/100, ca me fait donc un chiffre qui va aller de 0 à 23.59

Mais oui! entre 5 et 5 ... il me trouve des résultats! Bug?

Comment de 5.00 jusqu’à 5.59, SQL peut-il dire que c'est entre 5 et 5...??
--> seule réponse que je vois c'est qu'il l'a rangé par ordre alphabétique??
Non, ce n'est pas un bug. Comme l'a dit Ibersek, cela vient de ta division. DATEPART te retourne un INT. Appliqué sur les minutes, ca donne un entier inférieur à 60, que tu divise par 100. Cela te donne donc 0 !

Code SQL :
1
2
3
4
5
6
 
DECLARE @i int
SET @i = 59
 
SELECT @i/100
--> 0



Tes colonnes sont de type DATETIME ? utilise les fonctions date !

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
SELECT  
	MaTable.client
	,MaTable.date
FROM MaTable
WHERE 
	MaTable.client = 'LE CLIENT'
	AND MaTable.date BETWEEN '24/01/2011 7:30' 
					AND '25/01/2011 15:00'
	AND DATEDIFF(
			SECOND,
			DATEADD(
				DAY,
				DATEDIFF(
					DAY,
					0,
					MaTable.date
				),
				0
			),
			MaTable.date
		)
		BETWEEN  DATEDIFF(SECOND, 0, '7:30')
		AND		DATEDIFF(SECOND, 0, '15:00')
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h00.


 
 
 
 
Partenaires

Hébergement Web