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

Développement SQL Server Discussion :

ACOS() provoque "Une erreur de domaine s'est produite"


Sujet :

Développement SQL Server

  1. #1
    Membre émérite Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Points : 2 953
    Points
    2 953
    Par défaut ACOS() provoque "Une erreur de domaine s'est produite"
    Salut,

    J'ai un comportement étrange qui, je pense, est lié au type des données. Je souhaite calculer arccos(1).
    Si 1 est un entier acos(1) me retourne 0. Par contre, si 1 vient d'un calcul de flottants la requête retourne l'erreur :
    Une erreur de domaine s'est produite
    Voilà de quoi illustrer le problème :
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    CREATE TABLE [dbo].[VILLE_1](
    	[LIB_VILLE] [nvarchar](255) NULL,
    	[CODE_INSEE] [float] NOT NULL,
    	[LATITUDE] [nvarchar](255) NULL,
    	[LONGITUDE] [nvarchar](255) NULL
    ) ON [PRIMARY]
     
    INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Bruyères', 88078, '48.2', '6.716667')
    INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Champ-le-Duc', 88086, '48.2', '6.716667')
     
    SELECT (acos(1)) AS A_COS,
    	cos(radians(cast(isnull(v1.LATITUDE, '0') AS float)))
    	*cos(radians(cast(isnull(v2.LATITUDE, '0') AS float)))
    	*cos(radians(cast(isnull(v2.LONGITUDE, '0') AS float))
    		-radians(cast(isnull(v1.LONGITUDE, '0') AS float))
            )
    	+sin(radians(cast(isnull(v1.LATITUDE, '0') AS float)))
    	*sin(radians(cast(isnull(v2.LATITUDE, '0') AS float))) AS VALEUR_CALCULEE
    FROM VILLE_1 v1
    	INNER JOIN VILLE_1 v2 ON v1.LIB_VILLE > v2.LIB_VILLE
    WHERE isnull(v1.LATITUDE, '') <> ''
    	AND isnull(v1.LONGITUDE, '') <> ''
    	AND isnull(v2.LATITUDE, '') <> ''
    	AND isnull(v2.LONGITUDE, '') <> ''
    	AND abs(abs(cast(isnull(v1.LATITUDE, '0') AS float)) - abs(cast(isnull(v2.LATITUDE, '0') AS float))) < 1
    	AND abs(abs(cast(isnull(v1.LONGITUDE, '0') AS float)) - abs(cast(isnull(v2.LONGITUDE, '0') AS float))) < 1
    ORDER BY v1.LIB_VILLE, v2.LIB_VILLE 
     
    SELECT (acos(
    		cos(radians(cast(isnull(v1.LATITUDE, '0') AS float)))
    		*cos(radians(cast(isnull(v2.LATITUDE, '0') AS float)))
    		*cos(radians(cast(isnull(v2.LONGITUDE, '0') AS float))
    			-radians(cast(isnull(v1.LONGITUDE, '0') AS float))
    			)
    		+sin(radians(cast(isnull(v1.LATITUDE, '0') AS float)))
    		*sin(radians(cast(isnull(v2.LATITUDE, '0') AS float)))
    		)
    	) AS A_COS
    FROM VILLE_1 v1
    	INNER JOIN VILLE_1 v2 ON v1.LIB_VILLE <> v2.LIB_VILLE
    WHERE isnull(v1.LATITUDE, '') <> ''
    	AND isnull(v1.LONGITUDE, '') <> ''
    	AND isnull(v2.LATITUDE, '') <> ''
    	AND isnull(v2.LONGITUDE, '') <> ''
    	AND abs(abs(cast(isnull(v1.LATITUDE, '0') AS float)) - abs(cast(isnull(v2.LATITUDE, '0') AS float))) < 1
    	AND abs(abs(cast(isnull(v1.LONGITUDE, '0') AS float)) - abs(cast(isnull(v2.LONGITUDE, '0') AS float))) < 1
    ORDER BY v1.LIB_VILLE, v2.LIB_VILLE
    Y a-t-il un moyen de pallier cela autre que l'utilisation d'un case when? Je trouverais ça plutôt laid dans ce cas de figure.

    Merci par avance.
    Les Cours et tutoriels JavaScript
    Penser à la recherche et au bouton

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    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 : 21 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Vous avez visiblement une erreur d'écart d'arrondis. Préférez utiliser le type DECIMAL avec la précision voulue. Je pense que vous aurez moins de soucis.

    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/ * * * * *

  3. #3
    Membre émérite Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Points : 2 953
    Points
    2 953
    Par défaut
    Finalement, j'ai utilisé case... Mais merci pour le type decimal, je n'y avais jamais pensé.
    Les Cours et tutoriels JavaScript
    Penser à la recherche et au bouton

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

Discussions similaires

  1. l'erreur système 5 c'est produite
    Par peche dans le forum Administration
    Réponses: 4
    Dernier message: 14/07/2011, 09h26
  2. Réponses: 1
    Dernier message: 22/06/2011, 09h40
  3. Réponses: 3
    Dernier message: 16/11/2009, 15h43
  4. Réponses: 3
    Dernier message: 12/05/2008, 18h05
  5. [MySQL] Afficher une erreur si un champ est rempli
    Par kevinf dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 11/11/2006, 20h09

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