Bonjour, j'ai une colonne dans ma table "Utilisateurs" appelée "PersonalDetails_DOB".
Le type de données est un NVARCHAR (10) et le "format" des données est actuellement au format JJ / MM / AAAA. p >
Je veux changer le format en AAAA.MM.JJ ou AAAA-MM-JJ, comment dois-je procéder?
J'ai déjà essayé d'exécuter une requête en SQL:
SELECT CONVERT(nvarchar(10), PersonalDetails_DOB, 102) as 'PersonalDetails_DOB' FROM Users;
Rien ne se passe et cela ne change aucune date par exemple. 06/02/1967 au 1967.02.06
4 Réponses :
Stockez les dates sous forme de dates et non de chaînes. Je vous recommande de tirer la valeur sous forme de date et non de chaîne:
update users set PersonalDetails_DOB = CONVERT(date, PersonalDetails_DOB, 103); alter users alter column PersonalDetails_DOB date;
Vous êtes plus en sécurité en utilisant try_convert()
:
select PersonalDetails_DOB from users where TRY_CONVERT(date, PersonalDetails_DOB, 103) is null;
Dois-je donc changer le type de données en «date» au lieu de Nvarchar? cela signifie que je perdrai toutes les données de la colonne? C'est Nvarchar pour une raison, je ne me souviens pas pourquoi et le changer en DateTime va gâcher beaucoup de choses dans l'application Web. En utilisant également votre code, j'obtiens l'erreur suivante: La conversion a échoué lors de la conversion de la date et / ou de l'heure à partir d'une chaîne de caractères.
@ZackAntonyBucci. . . Vos données sont faussées. Vous devrez passer du temps à corriger vos données et votre application si vous souhaitez utiliser la date de naissance. Bonne leçon sur les raisons pour lesquelles vous souhaitez utiliser des types appropriés pour stocker des données.
Vous avez besoin de deux fonctions convert ()
:
SELECT PersonalDetails_DOB, CONVERT(VARCHAR(10), CONVERT(DATE, PersonalDetails_DOB, 103), 102) FROM Users;
La conversion a échoué lors de la conversion de la date et / ou de l'heure à partir d'une chaîne de caractères.
@Zack Antony Bucci: Votre table contient alors des données qui ne correspondent pas à JJ / MM / AAAA
. C'est pourquoi vous devriez avoir stocké les dates sous forme de dates et non de chaînes en premier lieu. Je vous suggère de changer la conception de votre table (renommer la colonne, ajouter une colonne de date PersonalDetails_DOB
, remplir la nouvelle colonne avec une mise à jour, supprimer l'ancienne colonne).
Vous pouvez essayer la requête ci-dessous pour mettre à jour le format des valeurs de date et leur type de données en utilisant la fonction SUBSTRING () comme indiqué ci-dessous
declare @PersonalDetails_DOB NVARCHAR(10) set @PersonalDetails_DOB = '13/10/2018' --dd/MM/yyyy select SUBSTRING(@PersonalDetails_DOB,7,4) + '-' + SUBSTRING(@PersonalDetails_DOB,4,2) + '-' + SUBSTRING(@PersonalDetails_DOB,1,2) -- yyyy-MM-dd create table Users(PersonalDetails_DOB NVARCHAR(10)) insert into Users values ('01/10/2018') select * from Users --Before Update --Updating date values update Users set PersonalDetails_DOB = ( SUBSTRING(@PersonalDetails_DOB,7,4) + '-' + SUBSTRING(@PersonalDetails_DOB,4,2) + '-' + SUBSTRING(@PersonalDetails_DOB,1,2) )where PersonalDetails_DOB is not null select * from Users --After Update --Change the datatype ALTER TABLE Users ALTER COLUMN PersonalDetails_DOB date;
Vous pouvez trouver la démo en direct Démo en direct ici
Vous devriez peut-être d'abord définir le format de la date avant la conversion:
set dateformat dmy; select PersonalDetails_DOB ,convert(nvarchar(10), cast(PersonalDetails_DOB as datetime), 102) as ANSI_DOB ,convert(nvarchar(10), cast(PersonalDetails_DOB as datetime), 120) as ODBC_DOB from Users;
Votre requête traite
PersonalDetails_DOB
comme s'il s'agissait d'une date, alors qu'il s'agit en fait d'une chaîne. Le mieux serait de vraiment le stocker sous la forme d'uneDATE
. Tant qu'il est stocké sous forme de chaîne (NVARCHAR
), vous devrez soit utiliser la manipulation de chaîne pour échanger des parties de chaîne, soit la convertir en date avant de la convertir en une autre chaîne.@Zack Vous devez d'abord mettre à jour les valeurs au format de date, puis vous pouvez modifier le type de données de la colonne. Voyez ma réponse.