OVH Cloud OVH Cloud

question qui me surprends mais bon ! (experts SQL)

15 réponses
Avatar
Christophe
J'ai besoin de vos avis d'expertises sur SQL 2000

le dba actuel me dit qu'il ne faut pas utiliser cette requete car meme
microsoft dit que le between fonctionne mal avec les dates et que c'est
super dependant de ton systeme de date : (pourtant j'ai bien passées les
parametres en iso ?)
sachant qu'en plus DateSeance est dans un index !

Pouvez vous me donner votre avis sur ces 2 requetes !

Ma requete :
SELECT count(*)
FROM MaTable
WHERE datesemaine = '20060621'
AND DateSeance BETWEEN '20060625' AND '20060627'


Ca requete ?
SELECT count(*)
FROM MaTable
where datesemaine = '21/06/2006' and
convert(nvarchar, DateSeance, 103) in (
'25/06/2006','26/06/2006','27/06/2006')

5 réponses

1 2
Avatar
Christophe
Oui en fait le bornage c'est moi ai fait la boulette parce que je croyais
que le between inclué toute les heures du 27 donc jusqu'a 23:59:59
mais non ce malin s'arrete a 00:00:00 donc je rate toute la journée et j'ai
le prob qu'a 00:00:00 le 28 je peux avoir des resultats !

par contre je ne comprends pas il me ressort un enregistrement !

between '20060625' and '20060627 23:59:59'
il me ramene le record 2006 06 28 00:00:00

il faut que je ramene les secondes à zero pour qu'il me le ramene pas ou
sans les secondes en parametre ?

between '20060625' and '20060627 23:59:00'
ou ca
between '20060625' and '20060627 23:59'


"Christian Robert" (sansspam)> a écrit dans le
message de news:
En fait la requête numéro 1 a plusieurs avantages :
- Le format de date est universel, quel que soit la langue utilisé par
l'utilisateur çà fonctionnera.
- L'utilisation en tant que tel du BETWEEN permettra l'utilisation d'un
éventuel index sur le champ DateSeance.

La requête numéro 2 a plusieurs problèmes elle :
- Sur datesemaine il faudrait impérativement changer et mettre celà :
convert(nvarchar, datesemaine, 103) = '21/06/2006' le format de date


risquant
de poser problème. Le format idéal étant celui de la requête 1 en enlevant
les convert
- La fonction Convert sur 2 champs date enlève toute possibilité


d'utiliser
des index dessus.

En fait au final le plus gros problème est que les 2 requêtes ne


renverront
pas la même chose. En effet la 1ère revient à renvoyer toutes les dates


entre
le 25 juin à minuit jusqu'au 27 juin à minuit, les 2 bornes étant


incluses.
La 2ème renvient à renvoyer les dates du 25 juin à minuit, jusqu'au 27


juin à
23:59:59. et quelques ms... Ce qui, s'il existe une composante heure dans


vos
valeurs de DateSeance va poser bcp de problèmes !

Pas de DATEDIFF non plus pour les même raisons que le CONVERT évoquées


plus
haut.

J'espère avoir été clair...

--
Cordialement

Christian Robert
Consultant - Formateur chez Winwise
MCT - MCDBA - MCSD
MCTS & MCITP SQL Server 2005


"Christophe" a écrit :

> J'ai besoin de vos avis d'expertises sur SQL 2000
>
> le dba actuel me dit qu'il ne faut pas utiliser cette requete car meme
> microsoft dit que le between fonctionne mal avec les dates et que c'est
> super dependant de ton systeme de date : (pourtant j'ai bien passées les
> parametres en iso ?)
> sachant qu'en plus DateSeance est dans un index !
>
> Pouvez vous me donner votre avis sur ces 2 requetes !
>
> Ma requete :
> SELECT count(*)
> FROM MaTable
> WHERE datesemaine = '20060621'
> AND DateSeance BETWEEN '20060625' AND '20060627'
>
>
> Ca requete ?
> SELECT count(*)
> FROM MaTable
> where datesemaine = '21/06/2006' and
> convert(nvarchar, DateSeance, 103) in (
> '25/06/2006','26/06/2006','27/06/2006')
>
>
>


Avatar
Yanos El Guerilleros
Christophe a écrit :
Arf je vois bien la requete qu'il utilise mais il transforme rien c'est
exactement la meme ????



Pas toujours dans certains cas déjà la requête est optimisée avant. Dans
mes tests par exemple si j'utilise "*" au lieu de "count(*)" ma requête
sera optimisée avec des variables locales.
Sinon si tu regardes les arguments de l'opérateur utilisé pour ta
condition là tu verra qu'il n'y a pas de BETWEEN.

on voit meme les commentaires ?



Je ne crois pas sauf si les commentaires sont dans la requête elle même,
à confirmer.

j'ai essayé sous 2000 & 2005 pas mieux ?
plus pratique sous 2005 par contre !




Ha j'ai pas fait gaffe mes serveurs de prod sont sous 2000 donc pour le
moment je ne regarde pas trop 2005.

A++

--
Yanos

Gazzzzzzzzzz
Avatar
Rudi Bruchez
Christophe a écrit:

between '20060625' and '20060627 23:59:59'
il me ramene le record 2006 06 28 00:00:00



Si le type de ta colonne est smalldatetime, la précision est à la minute.
SQL Server arrondit en dessus à partir de 29.999 secondes pour convertir en
smalldatetime.

--
Rudi Bruchez, MCDBA
http://www.babaluga.com/
Avatar
Ch.
arf c'est ca !!
"Rudi Bruchez" <"rudi#nospam#[at]babaluga.com"> a écrit dans le message de
news: 1ttplw1becq9m$.2s4lao8yzpbh$
Christophe a écrit:

between '20060625' and '20060627 23:59:59'
il me ramene le record 2006 06 28 00:00:00



Si le type de ta colonne est smalldatetime, la précision est à la minute.
SQL Server arrondit en dessus à partir de 29.999 secondes pour convertir
en
smalldatetime.

--
Rudi Bruchez, MCDBA
http://www.babaluga.com/


Avatar
bruno reiter
si on veut les datesemaine de la journée du 26 et DateSeance du 25 au 27, il
faudrait :
SELECT count(*)
FROM MaTable
WHERE datesemaine BETWEEN '20060621' AND '20060621 23:59:59.997'
AND DateSeance BETWEEN '20060625' AND '20060627 23:59:59.997'

de plus il faut essayer de prendre la colonne sans conversion pour pouvoir
utiliser les index, la 2è requete ne pourrait pas utiliser un index sur
DateSeance.

br


"Christophe" a écrit dans le message de news:
%
J'ai besoin de vos avis d'expertises sur SQL 2000

le dba actuel me dit qu'il ne faut pas utiliser cette requete car meme
microsoft dit que le between fonctionne mal avec les dates et que c'est
super dependant de ton systeme de date : (pourtant j'ai bien passées les
parametres en iso ?)
sachant qu'en plus DateSeance est dans un index !

Pouvez vous me donner votre avis sur ces 2 requetes !

Ma requete :
SELECT count(*)
FROM MaTable
WHERE datesemaine = '20060621'
AND DateSeance BETWEEN '20060625' AND '20060627'


Ca requete ?
SELECT count(*)
FROM MaTable
where datesemaine = '21/06/2006' and
convert(nvarchar, DateSeance, 103) in (
'25/06/2006','26/06/2006','27/06/2006')




1 2