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 :

Problème avec fonction getdate() [2000]


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Qatar

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 489
    Points : 334
    Points
    334
    Par défaut Problème avec fonction getdate()
    Bonjour,

    J'ai une table qui a une colonne en default getdate sur sql server 2000.

    Cette colonne se remplie avec le format entier de getime() et je veux faire un UPDATE de cette dernière pour ne garder que le mois et l'année sous format année-mois (yyyy-mm).

    J'ai utilisé la fonction replace mais sans succès.

    Avez-vous une idée SVP ?

    Merci.

  2. #2
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Qatar

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 489
    Points : 334
    Points
    334
    Par défaut
    J'ai trouvé la bonne requête mais elle ne fonctionne pas en UPDATE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE table SET date_insert = SUBSTRING(CONVERT(VARCHAR(10),GETDATE(),101), 1, 10)
    Elle me donne l'erreur suivante :

    La conversion d'un type de données CHAR en type DATETIME a donné une valeur hors des limites des valeurs de date et d'heure.

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Vous ne l'avez pas précisé, mais visiblement votre colonne est de type DATETIME. Ce type contient une date et une heure, et vous ne pouvez y stocker des dates "partielles"

    Expliquez nous pourquoi vous voulez tronquer cette date, afin que l'on puisse vous indiquer des solutions.

  4. #4
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Qatar

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 489
    Points : 334
    Points
    334
    Par défaut
    Oui exactement ma colonne est de type datetime.

    Je veux la tranquer pour faire une insertion à partir de cette table avec seulement l'année et le mois.

    J'ai crée au début la colonne en format VARCHAR avec default getDate() mais la colonne était remplis par un format qui ne me convient pas (18 fév 2013.....)

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    ok, mais que faites vous de cette données ensuite, en quoi cela vous gène qu'elle contienne un jour précis et une heure.


    Au format DATETIME, vous pouvez "arrondir" au premier jour du mois, à minuit par exemple...

    Mais la solution technique dépend du besoin derrière :
    affichage ? filtrage ? regroupement ??

  6. #6
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Qatar

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 489
    Points : 334
    Points
    334
    Par défaut
    C'est une table d'historisation sur laquelle je travaille puis après je devrait insérer certaines lignes à partir de cette table au dépend de leur date d’insertion (date_insert) et qui dois correspondre uniquement au mois et à l'année.

    Vous voyez ?

    EDIT:

    Je viens de trouver une solution. J'ai recrée la table avec le type VARCHAR puis j'ai appliqué ma requête de conversion et j'ai eu le résultat qui me convient

    Merci pour votre aide.

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Vous voyez ?
    pas vraiment...

    Mais apparemment derrière vous voulez faire des filtres dessus. ou d'autres requêtes en tout cas...

    Un petit exemple, qui fait la somme de la colonne qte par mois en fonction de la colonne dte. je pense que vous pourrez l'adapter à votre besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    ;WITH JeuEssai AS (
    	SELECT 1 as id, CAST('2012-11-25T23:45:32'  as DATETIME) as dte, 1 as qte
    	UNION ALL SELECT 1 as id, CAST('2012-11-27T23:44:32'  as DATETIME) as dte, 10 as qte
    	UNION ALL SELECT 1 as id, CAST('2012-12-10T23:45:32'  as DATETIME) as dte, 20 as qte
    	UNION ALL SELECT 1 as id, CAST('2012-12-15T20:45:32'  as DATETIME) as dte, 75 as qte
    	UNION ALL SELECT 1 as id, CAST('2012-12-27T20:10:32'  as DATETIME) as dte, 17 as qte
    	UNION ALL SELECT 1 as id, CAST('2012-12-30T23:35:00'  as DATETIME) as dte, 2 as qte
    	UNION ALL SELECT 1 as id, CAST('2013-01-25T23:45:32'  as DATETIME) as dte, 112 as qte
    	UNION ALL SELECT 1 as id, CAST('2013-01-25T10:45:32'  as DATETIME) as dte, 34 as qte
    	UNION ALL SELECT 1 as id, CAST('2013-01-27T12:45:32'  as DATETIME) as dte, 61 as qte
    	UNION ALL SELECT 1 as id, CAST('2013-01-28T23:23:32'  as DATETIME) as dte, 89 as qte
    	UNION ALL SELECT 1 as id, CAST('2013-02-10T23:45:32'  as DATETIME) as dte, 9 as qte
    )
    SELECT
    	DATEADD(
    		MONTH,
    		DATEDIFF(
    			MONTH,
    			0,
    			dte
    		),
    		0
    	),
    	SUM(qte)
     
    FROM JeuEssai
    GROUP BY 
    	DATEADD(
    		MONTH,
    		DATEDIFF(
    			MONTH,
    			0,
    			dte
    		),
    		0
    	)

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 127
    Points : 208
    Points
    208
    Par défaut
    Bonjour,

    Si je puis me permettre, changer le type d'une colonne d'une table par un autre type en perdant de surcroît de la précision est une décision grave. As tu réfléchi aux impacts de ce changement ?

    Qui jusque là a rempli cette colonne ? si c'est un programme ou un script, il va falloir le modifier?
    Est-ce que d'autre programme, procedure ou requêtes accèdent à cette table ?
    Dans ce cas il faut aussi les modifier.

    Y a -t-il un document contenant le modèle physique de la base ?
    La aussi il faut le mettre à jour.

    Tu avais à mon avis plusieurs solutions beaucoup moins risquées :
    1. Conversions à la volée
    2. Création d'une vue avec cnversion de la colonne dans le bon format
    3. Création d'une table liée (ça c'est pas terrible ici mais c'est moins violent que la solution "d'amputation"
    4. Ajout d'une colonne MOISANNEE en laissant la colonne originale (la non plus c'est pas terrible mais une légère redondance me paraît préférable à une perte de précision + changement de type colonne existante


    A moins que ceci ne soit qu'un exercice de style et pas un épisode de la vie réelle, mais penses y dans le futur pour des cas réels : changer la structure d'une table est toujours un acte compliqué et risqué.

    Cordialement

  9. #9
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Qatar

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 489
    Points : 334
    Points
    334
    Par défaut
    Merci pour vos conseils j'y tiendrai compte pour le futur

    Actuellement je rencontre un autre problème toujours avec le type de données si vous avez une idée..

    Etant sur SQL 2000, j'ai une table contenant un champ de type VARCHAR et qui contient des dates (année et mois). Je dois faire une suppression de quelques valeurs à partir de cette colonne que je devrait comparer à la date du jour hors ça ne fonctionne pas quand je compare mon champs et getdate()..

    Ci dessous ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM MaTable WHERE MonChampTypeVARCHARAvecDesDates >= CONVERT(CHAR(10),GETDATE(),111)

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par DBA_OCP Voir le message
    ça ne fonctionne pas quand je compare mon champs et getdate()..
    c'est vague !
    Vous avez une erreur ? ça ne matche pas ? ça matche alors que ça ne devrait pas ?
    donnez nous un exemple du contenu de cette colonne.

    visiblement, vous faites une comparaison de chaine, donc '98/02/03' sera après '02/02/02'

  11. #11
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Qatar

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 489
    Points : 334
    Points
    334
    Par défaut
    Oui c'est une comparaison entre un champ varchar et getdate qui est un datetime.

    la requête que je viens de tester mais en erreur de conversion est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM maTable WHERE CAST(date AS DATETIME) >= CONVERT(CHAR(10),GETDATE()+20,111)
    Exemple de contenu de ma table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Date              Montant          Nature
              2013-02          1000                EC
              2030-11          300                  DOM
    ...etc

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Citation Envoyé par DBA_OCP Voir le message
    Je viens de trouver une solution. J'ai recrée la table avec le type VARCHAR puis j'ai appliqué ma requête de conversion et j'ai eu le résultat qui me convient
    Très mauvaise décision.
    D'ailleurs votre nouveau problème n'est qu'une conséquence de cette mauvaise décision.
    Gardez votre colonne en datetime et arrondissez au premier jour du mois comme vous l'a suggérez aieeeuuuuu.
    Vous conservez ainsi la possibilité de faire des comparaisons avec des dates sans passer éternellement par des conversions qui sont coûteuses.

  13. #13
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Qatar

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 489
    Points : 334
    Points
    334
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Gardez votre colonne en datetime et arrondissez au premier jour du mois comme vous l'a suggérez aieeeuuuuu
    Je peux utiliser la fonction ROUND sur DATETIME ?? Je ne pense pas...

    Comment je devrait faire cela SVP ? C'est pas possible avec la méthode que j'utilise actuellement ?

    Merci.

  14. #14
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par DBA_OCP Voir le message
    Je peux utiliser la fonction ROUND sur DATETIME ?? Je ne pense pas...
    Je vous ai donné la solution en post #7

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

Discussions similaires

  1. Problème avec fonctions et string/char
    Par vdumont dans le forum C++
    Réponses: 6
    Dernier message: 08/04/2006, 16h54
  2. Problème avec fonction
    Par Goundy dans le forum C
    Réponses: 24
    Dernier message: 01/10/2005, 20h17
  3. [MFC][WINSOCK] Problème avec fonction recv
    Par Le Farfadet dans le forum MFC
    Réponses: 4
    Dernier message: 23/09/2005, 11h00
  4. Problème avec fonction d'envoie de mail
    Par zyg dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 23/02/2005, 08h48
  5. [Requête] Problème avec fonction "DATE_FORMAT()"
    Par sekiryou dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2005, 21h52

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