web-dev-qa-db-fra.com

la conversion d'un type de données varchar en un type de données datetime a entraîné une valeur hors limites

J'ai le morceau suivant de code SQL en ligne que je lance à partir d'un service Windows C #:

UPDATE table_name SET 
    status_cd = '2', 
    sdate = CAST('03/28/2011 18:03:40' AS DATETIME), 
    bat_id = '33acff9b-e2b4-410e-baaf-417656e3c255', 
    cnt = 1, 
    attempt_date = CAST('03/28/2011 18:03:40' AS DATETIME) 
WHERE id = '1855'

Lorsque j'exécute cette opération sur une base de données SQL Server depuis l'application, le message d'erreur suivant s'affiche:

System.Data.SqlClient.SqlException: la conversion d'un type de données varchar en un type de données datetime a entraîné une valeur hors limites . La déclaration a été terminée.

Mais si je prends le morceau de SQL et l'exécute à partir de SQL Management Studio, il fonctionnera sans problème.

Des idées sur ce qui peut causer ce problème? 

30
amateur

Les formats de date ambigus sont interprétés en fonction de la langue de connexion. Cela marche

set dateformat mdy

select CAST('03/28/2011 18:03:40' AS DATETIME)

Cela ne veut pas

set dateformat dmy

select CAST('03/28/2011 18:03:40' AS DATETIME)

Si vous utilisez des requêtes paramétrées avec le type de données correct, vous évitez ces problèmes. Vous pouvez également utiliser le format univoque "non séparé" yyyyMMdd hh:mm:ss

61
Martin Smith

Mais si je prends le morceau de SQL et l'exécute à partir du studio de gestion de SQL, il fonctionnera sans problème.

Si vous êtes libre de changer le compte de service avec votre propre identifiant, qui hériterait de vos préférences linguistiques/régionales.

Le véritable noeud du problème est le suivant:

J'utilise ce qui suit pour convertir -> date.Value.ToString ("MM/jj/aaaa HH: mm: ss")

Veuillez commencer à utiliser des requêtes paramétrées afin de ne pas rencontrer ces problèmes à l'avenir. C'est aussi une pratique plus robuste, prévisible et optimale.

13
RichardTheKiwi

Je pense que la meilleure façon de travailler avec des dates entre C # et SQL consiste bien entendu à utiliser des requêtes paramétrées et à toujours utiliser des objets DateTime sur C # et les options de formatage ToString () fournies.

Mieux vaut exécuter set datetime <format> ( vous avez ici l’explication dateformat définie sur MSDN ) avant de travailler avec les dates sur SQL Server afin de ne pas avoir de problèmes, comme par exemple set datetime ymd. Il suffit de le faire une fois par connexion, car il conserve le format lorsqu'il est ouvert. Il est donc conseillé de le faire juste après avoir ouvert la connexion à la base de données.
Ensuite, vous pouvez toujours travailler avec les formats "aaaa-MM-jj HH: mm: ss: ffff".

Pour passer l'objet DateTime à votre requête paramétrée, vous pouvez utiliser DateTime.ToString('yyyy-MM-dd HH:mm:ss:ffff').

Pour analyser des dates formatées étranges en C #, vous pouvez utiliser la méthode DateTime.ParseExact(), dans laquelle vous avez la possibilité de spécifier exactement le format de saisie: DateTime.ParseExact(<some date string>, 'dd/MM-yyyy',CultureInfo.InvariantCulture). Ici vous avez l'explication DateTime.ParseExact () sur MSDN )

7
Iván Sainz

C'est un problème de format de date. En Irlande, le format de date standard pour le 28 mars serait "28-03-2011", alors que "03/28/2011" est la norme pour les États-Unis (parmi beaucoup d'autres).

1
srgerg

Je sais que cette solution est un peu différente de celle du PO, mais comme vous avez peut-être été redirigé ici en cherchant sur le titre de cette question sur Google, vous avez peut-être le même problème que moi.
Parfois, vous obtenez cette erreur parce que votre date et heure n’est pas valide, c’est-à-dire que votre date (au format chaîne) pointe vers un jour qui dépasse le nombre de jours de ce mois! Exemple: CONVERT(Datetime, '2015-06-31') m'a causé cette erreur, alors que je convertissais une déclaration de MySql (ce qui n’a pas été discuté! et rend l’erreur plus difficile à détecter) à SQL Server.

1
mok

Java8: utilisez LocalDateTime.now (). ToString ()

0
ariabele