question qui me surprends mais bon ! (experts SQL)
15 réponses
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')
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') > > >
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" <christian.robert@winwise.fr (sansspam)> a écrit dans le
message de news:27F5F294-C6B3-49B6-9676-635BD206E317@microsoft.com...
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')
>
>
>
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') > > >
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
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.
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
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/
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.
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/
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/
arf c'est ca !!
"Rudi Bruchez" <"rudi#nospam#[at]babaluga.com"> a écrit dans le message de
news: 1ttplw1becq9m$.2s4lao8yzpbh$.dlg@40tude.net...
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.
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/
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')
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" <christophe@digital16-9.com> a écrit dans le message de news:
%23RTT7gUlGHA.1276@TK2MSFTNGP03.phx.gbl...
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')
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')