Modifica di una parte del testo in una cella

di il
2 risposte

Modifica di una parte del testo in una cella

Buona sera.

Sono stato incaricato di esportare dei dati da un db in sql in un file di Access, che a sua volta dovrà essere convertito ... 

Il mio problema è il seguente: 

una tabella contiene dati anagrafici di persone, nome, cognome, data di nascita,…. e tutti i campi sono campi “testo”.

Su oltre 50.000 record complessivi, in un un migliaio circa, la data di nascita è espressa come gg/mm/aa, invece di essere come correttamente gli altri nel formato: gg/mm/aaaa.

Ho constatato che in questi record, l'anno completo è sempre 19xx.

Come posso “modificare” questi campi, in modo che l'anno sia di quattro cifre, considerando che sono (e devono rimanere) un campo testo? 

Potrei (eventualmente) modificare tali valori una volta esportati in Access, e comunque non saprei come fare, ma se fosse possibile, vorrei farlo all'interno del db originale.

grazie

2 Risposte

  • Re: Modifica di una parte del testo in una cella

    Salve,

    innanzitutto, a prescindere dal db utilizzato, E' SEMRE D'OBBLIGO UTILIZZARE IL TIPO DI DATO CORRETTO PER IL DOMINIO DELL'ATTRIBUTO!!!

    detto questo, e personalmente NON SONO d'accordo sulla soluzione che ti propongo (sempre per il motivo di cui sopra), puoi modificare il valore delle colonne con le funzioni di manipolazione delle stringhe, LEN(..), LEFT(…) e SUBSTRING(….)

    selezioni tutte le righe che abbiano la colonna DataNascita lunga 8 caratteri, e aggiorni il valore manipolandolo, trivialmente similarmente a

    SET NOCOUNT ON;
    use tempdb;
    GO
    CREATE TABLE dbo.Test (
    	Id int IDENTITY,
    	Nome varchar(10),
    	DataNascita varchar(10)
    	);
    GO
    INSERT dbo.Test
    	VALUES ('a', '05/07/1990' ), ( 'b', '06/07/85');
    
    SELECT *
    	FROM dbo.Test t;
    
    PRINT 'Proiezione';
    
    SELECT t.Id, t.Nome, t.DataNascita
    	, CASE WHEN LEN(t.DataNascita) = 8 
    		THEN LEFT(t.DataNascita, 6) + '19' + SUBSTRING(t.DataNascita, 7, 2)
    		ELSE t.DataNascita
    		END AS Formattata
    	FROM dbo.Test t;
    
    PRINT 'modifica dati in tabella';
    UPDATE dbo.Test
    	SET DataNascita = CASE WHEN LEN(DataNascita) = 10 then DataNascita
    						ELSE LEFT(DataNascita, 6) + '19' + SUBSTRING(DataNascita, 7, 2)
    						END
    	WHERE LEN(DataNascita) = 8;
    
    PRINT 'Proiezione';
    SELECT *
    	FROM dbo.Test t;
    
    GO
    DROP TABLE dbo.Test;
    
    --<-----------
    
    Id          Nome       DataNascita
    ----------- ---------- -----------
    1           a          05/07/1990
    2           b          06/07/85
    
    Proiezione
    Id          Nome       DataNascita Formattata
    ----------- ---------- ----------- ----------
    1           a          05/07/1990  05/07/1990
    2           b          06/07/85    06/07/1985
    
    modifica dati in tabella
    Proiezione
    Id          Nome       DataNascita
    ----------- ---------- -----------
    1           a          05/07/1990
    2           b          06/07/1985
    
    
    

    salutoni romagnoli
    – 
    Andrea

  • Re: Modifica di una parte del testo in una cella

    Buongiorno e ringrazio Andrea per la dritta

    La risposta è stata veramente chiara ed esauriente, per chi ha scarsa dimestichezza con la programmazione.

    Quel Db, nasce da un "archivio" che a suo tempo fu partorito in access, che nel corso degli anni è stato importato un sql.

    I campi contenuti nelle varie tabelle non sono per nulla ottimizzati… sono tutti “varchar(50)” indipendentemente da loro contenuto…

    le motivazioni le ignoro!

    Per tornare a noi, alla fine ho acquisito l'ottimo suggerimento e semplicemente ho applicato una sorta di concatenazione di parti del campo [DataNascita] presistente:

    SET DataNascita = LEFT(DataNascita, 6) + '19' + RIGHT(DataNascita, 2)
    WHERE LEN(DataNascita) = 8;

    Grazie infinite

Devi accedere o registrarti per scrivere nel forum
2 risposte