IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

[DATE] - Le 5° jour de la 31° semaine


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 298
    Par défaut [RESOLU] [DATE] - Le 5° jour de la 31° semaine
    Bonjour,

    Nous sommes aujourd'hui le 5° jour de la 31° semaine de l'année, 210° jour de l'année 2005.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select datepart(week, getdate());
    select datepart(weekday, getdate());
    select datepart(dayofyear, getdate());
    Je recherche le 5° jour de la 31° semaine de l'année 2004. C'était le vendredi 30 juillet 2004, et nous étions le 212° jour de l'année.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select datepart(week, '30/07/2004');
    select datepart(weekday, '30/07/2004');
    select datepart(dayofyear, '30/07/2004');
    Je ne sais pas s'il existe une "fonction inverse" dans SQlServer, et je ne trouve pas la requete SQL me permettant de le faire.

    En vous remerciant par avance.
    --[/b]

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 228
    Billets dans le blog
    25
    Par défaut
    Ajouter 211 jours au premier jour de l'année
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select  dateadd(d, 212, convert(datetime, '1.1.'+right(convert(varchar(10), getdate(), 104), 4)))
    Ajouter 5 jour et 31 semaines au premier jour de la première semaine de l'année
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select dateadd(d, 5, dateadd(ww, 31, dateadd(d, 8-datepart(w, convert(datetime, '1.1.'+right(convert(varchar(10), getdate(), 104), 4))) , convert(datetime, '1.1.'+right(convert(varchar(10),getdate(), 104),4)))))
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 298
    Par défaut
    Merci pour ton aide,

    Les 2 solutions proposées ne donnent pas la date du '30 juillet 2004'

    Mes premiers test étaient des solutions un peu similaire qui ne marchaient pas non plus.

    J'explique un peu mieux mon pb :
    Je veux comparer les ventes sur deux jours similaires sur l'année n et n-1.

    - Aujourd'hui nous sommes le vendredi 29 juillet 2005.
    - Si je fais getdate() - 365, j'obtiens le jeudi 29 juillet 2004.

    La date est la même : 29 juillet. mais le jour n'est pas le même : Jeudi ou Vendredi. Pour comparer des ventes, cela n'est pas satisfaisant. En effet, cela amenera a comparer un Lundi avec un Dimanche. Ce qui n'a aucun sens.

    La date que je veux obtenir, c'est le même jour de l'année n-1, le 5° jour de la 31° semaine de 2004.

    Je pensais qu'il était relativement facile d'obtenir le nieme jour de la nieme semaine. Mais en fait cela n'a pas l'air aussi trivial.

    Je ne sais pas si cela est réalisable, simplement en faisant un select, je vais essayer de me developper une petite UDF

  4. #4
    Yad
    Yad est déconnecté
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 58
    Par défaut
    Tiens moi au courant de tes recherches ... car même si tu n'est pas blonde à forte poitrine, ça m'intérrèsse aussi ...

    yad@yadworld.net

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 298
    Par défaut
    Une première approximation, très simpliste, qui ne marche pas pour les années bissextiles, consiste simplement à enlever 364 jours à la date courante.
    D'ici 2008, nous aurons le temps de trouver une meilleure solution

  6. #6
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 228
    Billets dans le blog
    25
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dateadd(d, datepart(w, date1)- datepart(w, date2), dateadd(y,1,date1))
    la soustration des deux datepart vous recalibrent sur le même jour, non ?
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 009
    Billets dans le blog
    6
    Par défaut
    la seule solution viable pour ce genre de calculs est d'implémenter un calendrier comme décrit dans cet article :
    http://sqlpro.developpez.com/cours/gestiontemps/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select cast('01/01/' + cast(datepart(year, GetDate()) - 1 as varchar(4)) as datetime)
         + (datepart(week, GetDate()) - 1) * 7 
         + datepart(weekday, GetDate()) 
         - datepart(weekday, cast('01/01/' + cast(datepart(year, GetDate()) - 1 as varchar(4)) as datetime))
    Attention néanmoins, la définition du N° de semaine par défaut (qui n'est pas la norme ISO 8601) risque de te créer des surprises, par exemple le mercredi de la première semaine de 2000 n'existe pas alors qu'il existe en 2001 !

    Si tu veux le même jour de la semaine, le plus proche, getdate () - 364, est une solution qui marche même pour les années bisextiles , mais risque de te donner un résultat qui n'est pas dans la même semaine, voire pas dans la même année.

  9. #9
    Membre éclairé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 298
    Par défaut
    Citation Envoyé par Médiat
    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select cast('01/01/' + cast(datepart(year, GetDate()) - 1 as varchar(4)) as datetime)
         + (datepart(week, GetDate()) - 1) * 7 
         + datepart(weekday, GetDate()) 
         - datepart(weekday, cast('01/01/' + cast(datepart(year, GetDate()) - 1 as varchar(4)) as datetime))
    Merci cette solution marche, même pour le 29 février 2008.

    Concernant la gestion d'un calendrier détaillé dans l'excellent article de SQLPro, c'est effectivement une solution que j'ai commencé à implémenter pour des projets perso.

    Merci à tous pour vos contributions

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/01/2009, 14h31
  2. Réponses: 14
    Dernier message: 10/08/2006, 16h53
  3. Réponses: 7
    Dernier message: 31/07/2006, 14h50
  4. Réponses: 7
    Dernier message: 05/04/2006, 12h22
  5. Réponses: 14
    Dernier message: 30/12/2005, 20h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo