2010-06-01 6 views
1

J'ai reçois une erreur quand je tente de modifier une colonne Date:Cast ou Convertir?

Arithmetic overflow error for type varchar, value = 20100601.000000. 

Je voudrais qu'il aille de flotter au format datetime de 20100601.

Depuis Alter ne fonctionne pas, comment puis-je utiliser cast ou convertir pour changer le type de données pour chaque entrée dans la table?

+1

Quel est le type de données en cours et qu'est-ce que tu veux qu'il soit? –

+0

En ce moment, il est "flottant" et je voudrais qu'il soit quel que soit le type de données pour '20100601'. Savez-vous? – Daniel

+0

Avez-vous des valeurs comme 20100601.250000 pour 06:00 le 1er juin 2010? – gbn

Répondre

2
UPDATE table_name 
SET new_date_column=CAST(CAST(CAST(old_date_column AS INT) AS VARCHAR) AS DATETIME) 

Cela mettra à jour la nouvelle colonne

+0

Merci beaucoup, c'est exactement ce que je recherche. En cours d'exécution .. – Daniel

+0

Pas de problème. Heureux d'avoir pu aider. Marquer comme réponse s'il vous plaît? Merci, Gale – geshafer

+0

Cela m'a effectivement donné un format date-heure de 'Juin 1 2' Comment pouvons-nous l'afficher 20100601? – Daniel

3

"20.100.601,000000" quand il est lancé à datetime de flotteur signifie 20 millions, 100 mille 601 jours après le 1 janvier 1900.

"20100601" en tant que chaîne est le 01 Juin 2010. L'

j'utiliser que ce soit 100% sûr de conversions

SELECT CAST(CAST(CAST(20100601.000000 AS int) AS char(8)) AS datetime) 
+0

OK, mais cela ne répond pas à ma question sur la façon de convertir ou de lancer pour chaque valeur dans la colonne. – Daniel

+0

Je le comprends maintenant. Puis-je appliquer ce code à toute la colonne? – Daniel

+1

Cela ne causera-t-il pas la perte d'un composant temporel s'il y en a un? –

2

Je suis sûr qu'il doit y avoir une meilleure façon ...

ALTER TABLE dbo.YourTable ADD 
    NewColumn datetime NULL 

UPDATE [YourTable] 
    SET [NewColumn] = 
     CAST(CAST(CAST(ROUND(YourOriginalColumn,0) as INT) AS char(8)) AS DATETIME) 

Ensuite, si l'idée est de remplacer l'ancienne colonne après que vous avez bon sens vérifié les choses, a fait une copie de sauvegarde, etc.

ALTER TABLE dbo.Cars 
    DROP COLUMN YourOriginalColumn 

EXECUTE sp_rename N'dbo.YourTable.NewColumn', N'YourOriginalColumn', 'COLUMN' 
+1

Non. C'est très clair sur les moules qui sont nécessaires. Je suis arrivé avec le même ... – gbn

+0

Comment est-ce que je fais ceci pour CHAQUE valeur dans la colonne? Plus de 1 000 000 lignes – Daniel

+1

Je voudrais ajouter une nouvelle colonne à la table du type de données correct le mettre à jour à la nouvelle valeur, vérifier la santé puis abandonner l'ancienne colonne et renommer la nouvelle si votre SGBDR le permet. Quel RDBMS utilisez-vous actuellement? J'ai utilisé ROUND qui n'est peut-être pas pris en charge ou réellement requis, mais lorsque vous le stockez en tant que point flottant, je me sens un peu plus en sécurité. –