3
votes

Message d'erreur lors de l'insertion de la date dans le tableau

lorsque j'essaye d'insérer mes valeurs de date dans toutes mes autres tables, cela fonctionne bien, sauf une. Quel que soit le format que j'essaie, j'obtiens toujours l'erreur, que la valeur insérée n'a pas pu être convertie d'un caractère d'entrée au format de date attendu.

C'est comme ça que j'insère mes valeurs

CREATE TABLE dbo.ServiceTicket (
  ticketIssueNo INT NOT NULL IDENTITY(1,1) PRIMARY KEY, --Identity autoincrements
  serviceDate DATE NOT NULL,
  vehicleId CHAR(8) NOT NULL,
  customerId CHAR(8) NOT NULL,
  inspectionId CHAR(8) NOT NULL,
  serviceCost DECIMAL(10,4) NOT NULL CHECK(serviceCost BETWEEN 0.0 AND 99999.0) DEFAULT 0.0,
  inspectionCost DECIMAL(10,4) NOT NULL CHECK(inspectionCost BETWEEN 0.0 AND 99999.0) DEFAULT 0.0,
  repairCost DECIMAL(2,2) NOT NULL CHECK(repairCost BETWEEN 0.0 AND 99999.0) DEFAULT 0.0,
  GST DECIMAL(10,4) NOT NULL DEFAULT 0.0,
  amountDue DECIMAL(10,4) NOT NULL CHECK(amountDue BETWEEN 0.0 AND 99999.0) DEFAULT 0.0,
  FOREIGN KEY(vehicleId) REFERENCES Vehicle(vehicleId)
  ON UPDATE NO ACTION,
  FOREIGN KEY(inspectionId) REFERENCES VehicleInspection(inspectionId)
  ON UPDATE NO ACTION,
  FOREIGN KEY(customerId) REFERENCES Customer(customerId)
  ON UPDATE NO ACTION
)
GO

Et voici la structure du tableau:

-- ServiceTicket
INSERT INTO ServiceTicket
VALUES ('90000', '01-5-2019', '50000', '10000', '70000', 200.00, 100.00, 5.00, 350.00) --Error converting into DATE type

Je pourrais oublier quelque chose.


1 commentaires

un jour viendra (je souhaite) où je ne ressentirai plus le besoin de mettre à jour chaque question SQL avec une instruction DDL, mais c'est aujourd'hui. +1.


5 Réponses :


0
votes

Le format de date '01 -5-2019 ' que vous utilisez ne semble pas être un littéral de date accepté par défaut par SQL Server. Essayez d'utiliser '20190501':

INSERT INTO ServiceTicket (serviceDate, ... <other columns>)
VALUES
    ('20190501', ...);

Notez que YYYYMMDD est un format ISO sans équivoque et non séparé, comme le documentation discute.


3 commentaires

Et même pas un mot sur le fait de ne pas avoir spécifié la liste des colonnes? Je veux dire, je m'attendrais à ce que vous le mentionniez au moins (j'ai déjà vu certaines de vos réponses, je sais que vous savez mieux ...)


@ZoharPeled La chose drôle (ou peut-être triste) est que ma réponse a peut-être fonctionné, envoyant totalement le mauvais message:


Non, ce ne serait pas le cas, car ticketIssueNo est une colonne d'identité ... Je suppose que c'est ce qui a confondu l'OP au départ.



0
votes

Le format par défaut du type de données année dans SQL est AAAA-MM-JJ (si vous ne l'avez pas changé auparavant) Info . Ainsi, comme décrit ici , vous devez convertir la chaîne d'entrée en un type de date.


1 commentaires

en fait, c'est faux. Le format correct est ISO8601. (aaaammjj ou aaaa-mm-jj).



0
votes

Le format pour insérer le type de date dans SQL est AAAA-jj-MM, vous devez le changer en '2019-05-01'


2 commentaires

en fait, c'est faux. Le format correct est ISO8601. (aaaammjj ou aaaa-mm-jj)


Je voulais dire la même chose



1
votes
  1. Toujours répertoriez les colonnes lors de l'écriture d'une instruction d'insertion.
  2. Voici un réseau équivalent exact de votre instruction d'insertion, écrit correctement, basé sur le DDL que vous avez publié:

    INSERT INTO ServiceTicket
    (serviceDate, vehicleId     , customerId, inspectionId  , serviceCost   , inspectionCost, repairCost, GST   , amountDue) VALUES
    ('2019-05-01', '90000'      , '50000'   , '10000'       , '70000'       , 200.00        , 100.00    , 5.00  , 350.00)
    

    J'ai utilisé des onglets pour que chaque valeur soit parfaitement aligné avec la colonne dans laquelle il entre, ce qui aide beaucoup lorsque vous avez une longue liste de colonnes.
    Comme vous pouvez le voir clairement, le serviceDate obtient la valeur '90000' - alors qu'il devrait clairement être '01 -5-2019 ' p>

    1. Toujours utiliser le format ISO8601 pour la représentation sous forme de chaîne des valeurs de date / date / heure.
      Tout autre format dépend de la culture, et le pire à ce sujet est qu'il dépend de la langue par défaut de la connexion - ainsi, différentes connexions peuvent avoir des résultats différents si vous utilisez un format dépendant de la culture. La norme ISO8601 propose deux alternatives pour les formats datetime: aaaa-mm-jjThh: mm: ss ou aaaammjjThhmmss . Si vous insérez uniquement une valeur de chaîne de date uniquement dans une colonne / variable de type de données DateHeure , veillez à n'utiliser que le deuxième format ( aaaammjj ) - car aaaa-mm-jj dépend toujours de la culture avec DateTime (mais pas avec Date ou avec DateTime2 - c'est une raison de plus pour laquelle vous ne devriez jamais utiliser DateTime code > à nouveau.

    Donc, la bonne façon d'écrire l'instruction d'insertion serait la suivante:

    INSERT INTO ServiceTicket
    (serviceDate, vehicleId     , customerId, inspectionId  , serviceCost   , inspectionCost, repairCost, GST   , amountDue) VALUES
    ('90000'    , '01-5-2019'   , '50000'   , '10000'       , '70000'       , 200.00        , 100.00    , 5.00  , 350.00)
    

    (c'est-à-dire, en supposant que 01-5-2019 représente le 1er mai. S'il s'agit du 5 janvier, ce devrait être 2019-01-05).


5 commentaires

merci beaucoup j'ai essayé le format différent et je rencontre toujours la même erreur. Toutes les autres tables avec des types DATE semblent parfaitement bien.


J'ai essayé DATE avec la norme ISO8601 respectée et j'ai même changé le type en DATETIME comme suit: - ServiceTicket INSERT INTO ServiceTicket VALUES ('90000', '2019-05-01 06: 33: 59.123456', '50000', '10000 ',' 70000 ', 200,00, 100,00, 5,00, 350,00) mais cela ne change rien à l'erreur. C'est constamment le code d'erreur de la base de données: 241 @Zohar_Peled


Parce que le format de la date n'est qu'une partie du problème. L'autre partie du problème est, comme je l'ai clairement indiqué dans la première partie de ma requête, que vous essayez d'insérer '90000' dans la colonne date . De plus, vous ne devez pas utiliser DateTime . Si vous n'avez besoin que d'une date, utilisez le type de données Date . si vous avez besoin d'une date et d'une heure, utilisez DateTime2 . Et une dernière chose, l'ISO8601 utilise T comme séparateur entre la partie date et la partie heure, pas l'espace.


Vous essayez maintenant d'insérer '70000' dans serviceCost . Utilisez la technique de tabulation que j'ai montrée dans ma réponse, cela aide vraiment à voir quelle valeur va à quelle colonne.


Heureux de vous aider: -)



0
votes

Changez votre format de date de '01 -5-2019 ' à ' 2019-05-01 '.

Au lieu de cela, passez la date sous la forme '01 -5-2019 ' passez CAST ('01 -5-2019' AS DATE) .


1 commentaires

Ce serait un excellent commentaire, mais une réponse de très faible qualité ... De plus, cela n'aidera pas dans ce cas particulier. Et ont déjà été suggérés 4 fois.