2
votes

Convertir Nvarchar DD / MM / YYYY en YYYY-MM-DD dans une requête SQL

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


2 commentaires

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'une DATE . 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.


4 Réponses :


2
votes

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;


2 commentaires

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.



2
votes

Vous avez besoin de deux fonctions convert () :

SELECT PersonalDetails_DOB, 
       CONVERT(VARCHAR(10), CONVERT(DATE, PersonalDetails_DOB, 103), 102)
FROM Users;


2 commentaires

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).



0
votes

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


0 commentaires

0
votes

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;


0 commentaires