2017-03-28 3 views
0

Dans ma base de données SQL Server existante, il y a une colonne comme ceci:valeur de la colonne de texte Convert (12 heures) à 24 heures de la colonne varchar dans SQL Server

  • Nom de la colonne et le type: meeting_time varchar(22)
  • Valeurs stocké dans un format différent comme 02:30:PM/2:30:PM/14:00:AM/10:00:00:AM/9:2:PM

Je fais des travaux liés à la migration. Dans la base de données existante, ce type de valeurs était stocké. Je veux convertir ceux-ci en format de 24 heures.

Lorsque j'ai essayé avec la commande stuff avec la combinaison de IIF. Il continue d'augmenter et je ne sais pas si le dernier db a d'autres valeurs. Depuis l'application existante, les valeurs peuvent être saisies par l'utilisateur et stockées dans la base de données.

Quelqu'un peut-il m'aider s'il vous plaît?

Merci d'avance.

+0

Le problème réel est que vous stockez les heures sous forme de chaînes au lieu des valeurs 'time'. La base de données ne devrait pas se soucier de la mise en forme, cela devrait être laissé à l'application * client *. Seule l'application cliente sait comment l'utilisateur final souhaite afficher les heures. En fait, le client peut vouloir changer de format simplement en changeant un paramètre. –

+0

Vous pouvez convertir toutes ces valeurs en temps s'il n'y avait pas de ':' avant 'PM', par exemple' select cast ('02: 30 PM 'comme time) 'et' select cast ('9: 2 PM' comme heure) 'travail. '14: 00: AM' n'est pas une heure valide. Est-ce une valeur réelle? Est-ce que 'AM' est traité comme indésirable dans ce cas? Si c'est le cas, vous devrez nettoyer ces données bizarres avant de convertir en 'time' ou tout autre format de texte –

Répondre

2

Vous devez d'abord convertir les valeurs stockées dans la colonne meeting_time en format d'heure valide. Exemple 02: 30: PM-PM 02h30, 10: 00: 00: AM-10:00:00. Je pense que vous pouvez utiliser

REPLACE(REPLACE(meeting_time, ':AM', ' AM'), ':PM', ' PM') 

ensuite le convertir en type de données TIME

CAST(REPLACE(REPLACE(meeting_time, ':AM', ' AM'), ':PM', ' PM') AS TIME) 

Et puis formatez le temps converti au format que vous souhaitez (la valeur en fonction ci-dessous CONVERT spécifie le 24 format de l'heure heures visant)

CONVERT(varchar(22), CAST(REPLACE(REPLACE(meeting_time, ':AM', ' AM'), ':PM', ' PM') AS TIME), 108) 

Si vous utilisez MS SQL Server 2012 (ou plus récent) et vous pouvez également essayer la conversion valeur non valide, alors nous pourrions utilisé TRY_CAST à la place CAST

CONVERT(varchar(22), 
     IIF(TRY_CAST(REPLACE(REPLACE(meeting_time, ':AM', ' AM'), ':PM', ' PM') AS TIME) IS NULL, 
      TRY_CAST(REPLACE(REPLACE(meeting_time, ':AM', ''), ':PM', '') AS TIME), 
      CAST(REPLACE(REPLACE(meeting_time, ':AM', ' AM'), ':PM', ' PM') AS TIME)) 
     , 108) 
+0

+1 et merci pour la bonne réponse. Mais certaines colonnes ont des données invalides comme '14: 00: AM'. En le convertissant en temps, il lance une erreur. Avez-vous une idée de gérer cela. – Tamil

+1

Quelle version de SQL Server utilisez-vous? À partir de SQL Server 2012, il y a la fonction TRY_CAST, vous pouvez l'utiliser à la place de CAST. En cas de valeur invalide, il retournera NULL. –

+1

J'ai mis à jour ma réponse, veuillez vérifier –