web-dev-qa-db-fra.com

Convertir NVARCHAR en DATETIME dans SQL Server 2008

Dans ma table

LoginDate  
2013-08-29 13:55:48  

Le type de données de la colonne loginDate est nvarchar(150)

Je souhaite convertir la colonne logindate au format date-heure à l'aide de la commande SQL

Résultat attendu.

LoginDate  
29-08-2013 13:55:48
5
user2617053
DECLARE @chr nvarchar(50) = (SELECT CONVERT(nvarchar(50), GETDATE(), 103))

SELECT @chr chars, CONVERT(date, @chr, 103) date_again
5
user586399
SELECT CONVERT(NVARCHAR, LoginDate, 105)+' '+CONVERT(NVARCHAR, LoginDate, 108) AS LoginDate FROM YourTable

Output
-------------------
29-08-2013 13:55:48
2
Nisha
alter table your_table
alter column LoginDate datetime;

démo SQLFiddle

1
juergen d

Comme vos données sont nvarchar, il n'y a aucune garantie qu'elles seront converties en datetime (car elles peuvent contenir des informations de date/heure non valides) - donc un moyen de gérer cela est d'utiliser ISDATE que j'utiliserais dans une application croisée. (Les résultats de l'application croisée sont réutilisables, ce qui facilite les formats de sortie.)

|                     YOUR_DT |             SQL2008 |
|-----------------------------|---------------------|
|         2013-08-29 13:55:48 | 29-08-2013 13:55:48 |
|    2013-08-29 13:55:48 blah |              (null) |
| 2013-08-29 13:55:48 rubbish |              (null) |

SELECT
  [Your_Dt]
, convert(varchar, ca1.dt_converted ,105) + ' ' + convert(varchar, ca1.dt_converted ,8) AS sql2008
FROM your_table
CROSS apply ( SELECT CASE WHEN isdate([Your_Dt]) = 1
                        THEN convert(datetime,[Your_Dt])
                        ELSE NULL
                     END
            ) AS ca1 (dt_converted)
;

Remarques:

Vous pouvez également introduire left ([Your_Dt], 19) pour n'obtenir qu'une chaîne comme '2013-08-29 13:55:48' de '2013-08-29 13:55:48 poubelles'

Pour cette sortie spécifique, je pense que vous aurez besoin de 2 styles de date 2008 sql (105 & 8) sql2012 ajoutés pour comparaison

declare @your_dt as datetime2
set @your_dt = '2013-08-29 13:55:48'

select
  FORMAT(@your_dt, 'dd-MM-yyyy H:m:s') as sql2012
, convert(varchar, @your_dt ,105) + ' ' + convert(varchar, @your_dt ,8) as sql2008

|             SQL2012 |             SQL2008 |
|---------------------|---------------------|
| 29-08-2013 13:55:48 | 29-08-2013 13:55:48 | 
1
Used_By_Already

et ça

--// Convert NVARCHAR to DATETIME
DECLARE @date DATETIME = (SELECT convert(DATETIME, '2013-08-29 13:55:48', 120))
--// Convert DATETIME to custom NVARCHAR FORMAT
SELECT 
RIGHT('00'+ CAST(DAY(@date) AS NVARCHAR),2) + '-' +
RIGHT('00'+ CAST(MONTH(@date) AS NVARCHAR),2) + '-' + 
CAST(YEAR(@date) AS NVARCHAR) + ' ' + 
CAST(CONVERT(TIME,@date) AS NVARCHAR)

résultat: '29 -08-2013 13: 55: 48.0000000 '

0
Muflix

Qu'est-ce que tu ne veux pas faire exactement? Pour modifier le type de données de la colonne, vous pouvez simplement utiliser la commande alter comme

ALTER TABLE nom_table ALTER COLUMN LoginDate DateTime;

Mais rappelez-vous que la date ne doit être valide que dans cette colonne, mais le type de données est nvarchar.

Si vous ne souhaitez pas convertir le type de données lors de la récupération des données, vous pouvez utiliser la fonction CONVERT comme,

CONVERT (type_données (longueur), expression, style)

par exemple:

SELECT CONVERT (DateTime, loginDate, 6)

Cela renverra le 29 août 13. Pour plus de détails sur la fonction CONVERT, vous pouvez visiter,

http://www.w3schools.com/sql/func_convert.asp .

N'oubliez pas, utilisez toujours le type de données DataTime pour la colonne DateTime.

Merci

0
Regon