Requete mysql / where selection par semaine ???

Requete mysql / where selection par semaine ??? - SQL/NoSQL - Programmation

Marsh Posté le 29-10-2004 à 14:07:56    

Bonjour,
 
voila j'ais une DB mysql, avec dans chaqu'une de mes tables un champs datetime.
 
deux pb se pose t'a moi.
 
1er/ je souhaite faire une selection de champs avec en clause where et une selection par semaine (mais pas par numero de semaine sur l'année) mais par la date actuelle moins 1 ou 2 ou 3 semaine en arrières.
es possible avec mysql ?
 
2eme/ je souhaite afficher un calcul entre deux tables sous mysql :
dans chaqu'une des tables il y a 14 enregistrement, je veux qu'il me fasse un calcul ligne par ligne. et quand je fais cette requete il me m'affiche 14 fois 14 lingnes.
 
select T8 * France from web_asr_x, web_clients_x  
 
si vous avez une idée !!!
 
merci d'avance  
 
 
 
 
 

Reply

Marsh Posté le 29-10-2004 à 14:07:56   

Reply

Marsh Posté le 29-10-2004 à 15:08:57    

1/ File un exemple, c'est pas clair ce que tu dis.
2/ Faudrait penser à lui indiquer un critère de jointure. Généralement, c'est web_adr_x.id = web_clients_x.asrid par exemple.

Reply

Marsh Posté le 29-10-2004 à 15:23:21    

Problem N°1/
voila un exemple de requete que j'utilise sous sql server:
select count(*) from dbo.billing_record  
 where phone_number like '225%'
 and pin ='PAR'
 and start_time > substring (convert (varchar (8),dateadd(week,-1,getdate()),112),1,8) + ' 00:00:00.000'
 and start_time < substring (convert (varchar (8),dateadd(week,-1,getdate()),112),1,8) + ' 23:59:59.000'
 
ceci fonction ce qui veut qu'il va m'afficher les resultats de la semaine actuelle -1 semaine. donc si nous sommes en semaine 43 il va afficher la semaine 42.

Reply

Marsh Posté le 29-10-2004 à 15:54:06    

1/ Déjà, j'ai du mal avec ta requête SQL Server :D Elle retourne les infos du jour n-7 c'est ça ?
 
Bon... Je connais pas la fonction mysql qui retourne la date. On va dire que c'est la même que sous Oracle, c'est à dire la "constante" sysdate.
 
select count(*) from dbo.billing_record  
where phone_number like '225%'  
and pin ='PAR'  
and DATE(start_time) = CURDATE() - 7;
 
D'après cette doc :
http://dev.mysql.com/doc/mysql/fr/ [...] tions.html

Reply

Marsh Posté le 29-10-2004 à 16:01:15    

1/ Enfaite nan c'est pas jour n-7 mais semaine n-1 (du lundi au dimanche mais de la semaine derniére)

Reply

Marsh Posté le 29-10-2004 à 16:04:44    

D'ailleurs, pour ta requête MSSQL, je pense que :
 
select count(*) from dbo.billing_record  
where phone_number like '225%'  
and pin ='PAR'  
and CONVERT(char(8), start_time, 112) = CONVERT(char(8), getDate(), 112)
 
Ce serait pas plus mal :)

Reply

Marsh Posté le 29-10-2004 à 16:07:50    

nickylarson a écrit :

1/ Enfaite nan c'est pas jour n-7 mais semaine n-1 (du lundi au dimanche mais de la semaine derniére)


La requête telle que tu l'as écrite pour MSSQL fait n-7, pas "la semaine dernière".
 
Alors essaie ça :
 
select count(*) from dbo.billing_record    
where phone_number like '225%'  
and pin ='PAR'  
and WEEK(start_time, 1) = WEEK(CURDATE() - 7, 1);
and YEAR(start_time, 1) = YEAR(CURDATE() - 7, 1)
 
Et pour MSSQL, c'est quasi la même syntaxe.

Reply

Marsh Posté le 29-10-2004 à 16:22:46    

en mysql
 
Recupere tous les enregistrements de la semaine derniere (la semaine commence le lundi)
select *
from table
where week(ton_chap_date, 1) + 1 = week(now(), 1)
and year(ton_chp_date) = year(now());
 
oops j'ai oublie de preciser que c sur la meme année :)
faudra peut etre l'ameliorer au debut janvier


Message édité par Sebastien le 29-10-2004 à 16:24:23
Reply

Marsh Posté le 29-10-2004 à 16:27:26    

C'est la requête que j'ai écrit la ligne plus haut (sauf que j'ai utilisé "CURDATE()" au lieu de "NOW()", et qu'au lieu d'ajouter une semaine, j'en ai enlevé 7 jours) ;)
 
Deplus, à cause du second point, le 3 janvier 2005 ça marchera pas ton bidule ;)


Message édité par Arjuna le 29-10-2004 à 16:28:38
Reply

Marsh Posté le 29-10-2004 à 16:43:02    

Ca a pas l'air non plus de marche avec ton systeme.

Code :
  1. mysql> select date_reception, week((date_reception)-7, 1) from reclamation where week(date_reception,1) = 1 limit 5;
  2. +----------------+-----------------------------+
  3. | date_reception | week((date_reception)-7, 1) |
  4. +----------------+-----------------------------+
  5. | 2003-01-04     |                        NULL |
  6. | 2003-01-03     |                        NULL |
  7. | 2003-01-02     |                        NULL |
  8. | 2003-01-03     |                        NULL |
  9. | 2003-01-03     |                        NULL |
  10. +----------------+-----------------------------+
  11. mysql> select date_reception, week((date_reception)-7, 1) from reclamation where week(date_reception,1) = 5 limit 5;
  12. +----------------+-----------------------------+
  13. | date_reception | week((date_reception)-7, 1) |
  14. +----------------+-----------------------------+
  15. | 2003-01-31     |                           4 |
  16. | 2003-01-28     |                           4 |
  17. | 2003-01-27     |                           4 |
  18. | 2003-01-29     |                           4 |
  19. | 2003-01-30     |                           4 |
  20. +----------------+-----------------------------+
  21. 5 rows in set (0.00 sec)


Message édité par Sebastien le 29-10-2004 à 16:44:00
Reply

Marsh Posté le 29-10-2004 à 16:43:02   

Reply

Marsh Posté le 29-10-2004 à 17:08:14    

Ben... C'est null MySQL... Y'a un problème là, parceque normalement ça doit marcher sans problème !
 
Pour moi c'est un bug de MySQL.


Message édité par Arjuna le 29-10-2004 à 17:08:35
Reply

Marsh Posté le 29-10-2004 à 17:13:39    

Avec Oracle :
 
select datcre, to_char(to_date(datcre, 'YYYYMMDD') - 7, 'WW')
from eve
where codsoc = 0
and achvte = 'V'
and typeve = 'CDE'  
and to_char(to_date(datcre, 'YYYYMMDD'), 'WW') = 1
and datcre > '2004'
and rownum < 6
 
DATCRE TO_CHAR(TO_DATE(DATCRE,'YYYYMM
20040102 52
20040102 52
20040102 52
20040102 52
20040102 52
 
Et
 
select datcre, to_char(to_date(datcre, 'YYYYMMDD') - 7, 'WW')
from eve
where codsoc = 0
and achvte = 'V'
and typeve = 'CDE'  
and to_char(to_date(datcre, 'YYYYMMDD'), 'WW') = 2
and datcre > '2004'
and rownum < 6
 
DATCRE TO_CHAR(TO_DATE(DATCRE,'YYYYMM
20040108 01
20040108 01
20040108 01
20040108 01
20040108 01

Reply

Marsh Posté le 29-10-2004 à 17:16:16    

PS: Même si ça ressemble pas, c'est rigoureusement la même requête que la tienne, sauf que j'ai pas de champ de type date dans ma base, donc je dois les caster un coup avant :D

Reply

Marsh Posté le 29-10-2004 à 18:22:31    

OK merci a tout les deux pour ces infos.
je vais faire les tests et je vous dis ce que cela donne.
mais cela me semble un peu complique de faire une selection par semaine, sous ms sql serveur auriez vous la solution pour selection le mois precedent  
exemple : (mais ca marche pas !! )  
select * from x where datepart(month,getdate()) -1  
 
 
concernant mon 2eme probleme les deux tables n'ont aucun champs commun (identique).

Reply

Marsh Posté le 29-10-2004 à 20:01:12    

T'as pas la doc de SQL Server ?
 

Citation :


 Référence de Transact-SQL  
 
 
DATEPART
Renvoie un entier représentant l'élément de date précisé dans la date spécifiée.
 
Syntaxe
DATEPART ( datepart , date )  
 
Arguments
datepart
 
Paramètre qui indique la partie de date à renvoyer. La table suivante répertorie les éléments de date et les abréviations que reconnaît Microsoft® SQL Server™.
 
datepart Abréviations  
year yy, yyyy  
quart qq, q  
month mm, m  
dayofyear dy, y  
day dd, d  
weeek wk, ww  
weekday dw  
hour hh  
minute min  
second ss, s  
millisecond ms  
 
 
L'élément de date semaine (wk, ww) reflète les modifications apportées à SET DATEFIRST. Le 1er janvier d'une année définit le nombre de départ de l'élément de date semaine, par exemple : PARTIE_DE_DATE(wk, 'Jan 1, xxxx') = 1, avec xxxx représentant une année quelconque.
 
L'élément de date weekday (dw) renvoie un nombre correspondant au jour de la semaine, par exemple : Dimanche = 1, samedi = 7. Le nombre obtenu à l'aide de l'élément de date weekday dépend de la valeur configurée par SET DATEFIRST qui définit le premier jour de la semaine.
 
date
 
Expression correspondant à une valeur de type datetime ou smalldatetime, ou encore à une chaîne de caractères dans un format de date. N'utilisez le type de données datetime que pour les dates postérieures au 1er janvier 1753. Stockez en tant que données caractère les dates antérieures. Lorsque vous saisissez des valeurs de type datetime, faites-les toujours figurer entre guillemets. Étant donné que la minute est la précision de smalldatetime, en cas d'utilisation d'une valeur smalldatetime, les secondes et les millisecondes sont toujours égales à 0.
 
Si vous précisez seulement les deux derniers chiffres de l'année, les valeurs inférieures ou égales aux deux derniers chiffres de la valeur de l'option de configuration two digit year cutoff appartiennent au même siècle que l'année de coupure. Les valeurs supérieures aux deux derniers chiffres de la valeur de cette option appartiennent au siècle qui précède l'année de coupure. Par exemple, si l'option coupure des années à deux chiffres a pour valeur 2049 (valeur par défaut), 49 est interprété comme 2049 et 2050 est interprété comme 1950. Pour éviter toute ambiguïté, rédigez les années à l'aide de quatre chiffres.
 
Pour plus d'informations sur la définition des valeurs horaires, voir Formats d'heure. Pour plus d'informations sur la spécification des dates, voir datetime et smalldatetime.  
 
Type des valeurs renvoyées
int
 
Notes
Les fonctions DAY, MONTH et YEAR sont synonymes de DATEPART(dd, date), DATEPART(mm, date), et DATEPART(yy, date), respectivement.
 
Exemple
La fonction GETDATE renvoie la date actuelle. Cependant, la date complète n'est pas toujours l'information requise pour la comparaison (souvent seule une partie de la date fait l'objet d'une comparaison). L'exemple suivant montre les résultats obtenus par les fonctions GETDATE et DATEPART.
 
SELECT GETDATE() AS 'Current Date'
GO
 
Voici le jeu de résultats obtenu :
 
Current Date                
---------------------------  
Feb 18 1998 11:46PM          
 
SELECT DATEPART(month, GETDATE()) AS 'Month Number'
GO
 
Voici le jeu de résultats obtenu :
 
Month Number  
------------  
2            
 
L'exemple suivant suppose que la date est le 29 mai :
 
SELECT DATEPART(month, GETDATE())
GO
 
Voici le jeu de résultats obtenu :
 
-----------  
5            
 
(1 row(s) affected)
 
Dans cet exemple, la date apparaît comme un nombre. Retenez que, pour SQL Server, 0 est le 1er janvier 1900.
 
SELECT DATEPART(m, 0), DATEPART(d, 0), DATEPART(yy, 0)
 
Voici le jeu de résultats obtenu :
 
----- ------ ------
1     1      1900
 
 
Voir aussi
 
CAST et CONVERT
 
Types de données
 
Fonctions de date et d'heure
 
©1988-2000 Microsoft Corporation. Tous droits réservés.

Reply

Marsh Posté le 30-10-2004 à 00:04:40    

ok bien recu toutes mes requetes fonctionne,
par contre j'ais un souci de debut de semaine qui commence le dimanche et pas le lundi -- j'ais taper cette commande mais sans succé : set datefirst 1
 
quelqu'un peu me dire comment definir dans mon sql server 2000 de facon permanente, que la semaine commence le lundi et pas le dimanche.
 
merci bien

Reply

Marsh Posté le 01-11-2004 à 19:47:50    

nickylarson a écrit :

ok bien recu toutes mes requetes fonctionne,
par contre j'ais un souci de debut de semaine qui commence le dimanche et pas le lundi -- j'ais taper cette commande mais sans succé : set datefirst 1
 
quelqu'un peu me dire comment definir dans mon sql server 2000 de facon permanente, que la semaine commence le lundi et pas le dimanche.
 
merci bien


Logiquement, c'est hétité des paramètres régionaux du compte administrateur système de la machine.
 
Si ça ne fait rien, alors change juste les paramètres de SQL Server pour qu'il tourne sous ce compte et non pas le compte system.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed