Problema con date importate da file txt

  • Creatore Discussione Creatore Discussione Max61
  • Data di inizio Data di inizio

Max61

Utente Attivo
2 Mar 2014
760
4
18
Salve, come da titolo ho un problema con le date, mi spiego:
ho importato dati da un file txt in tabella e le date di questo file sono formattate così 2012015, io le vorrei trasformare nel formato 00-00-0000.
Mi sapete aiutare?
Grazie
Max61
 
Ciao, il problema è capire quale formato ha la data in entrata. Il valore che hai indicato è ambiguo. Secondo te quale dovrebbe essere il corrispettivo di "2012015" nel formato "00-00-0000" che vorresti ottenere?

Ti do qualche suggerimento...

Potrebbe essere un formato ISO nella forma ordinale "anno (4 cifre), giorni (3 cifre)":
2012015 => 2012 (anno), 015 (cioè 15 giorni dall'inizio dell'anno) => 15-01-2012

Potrebbe essere un formato ISO nella forma completa "anno (4 cifre), mese (2 cifre), giorno (2 cifre)", che però hai riportato in modo sbagliato qui sul forum (posso pensare che ti sei dimenticato una cifra):
20120105 => 2012 (anno), 01 (mese), 05 (giorno del mese) => 05-01-2012

Potrebbe essere un formato comune nella forma "giorno (2 cifre), mese (2 cifre), anno (4 cifre)", che però hai riportato in modo sbagliato (come per l'ipotesi precedente):
20122015 => 20 (giorno), 12 (mese), 2015 (anno) => 20-12-2015

Potrebbe essere un formato "...meno" comune, in cui l'anno è indicato con 3 cifre:
2012015 => 20 (giorno), 12 (mese), 015 (anno) => 20-12-2015

Potrebbe essere un formato comune ma nella forma americana "mese (2 cifre), giorno (2 cifre), anno (4 cifre)", che però (solita storia) magari hai sbagliato riportandolo sul forum:
02012015 => 02 (mese), 01 (giorno), 2015 (anno) => 02-01-2015

Se rientri nelle prime due ipotesi, potresti risolvere con una cosa del genere:

PHP:
$datainput = "2012015"; // equivale a "20120115"
$dataoutput = date('d-m-Y', strtotime($datainput));
echo $dataoutput;
 
Ciao, il problema è capire quale formato ha la data in entrata. Il valore che hai indicato è ambiguo. Secondo te quale dovrebbe essere il corrispettivo di "2012015" nel formato "00-00-0000" che vorresti ottenere?

Ti do qualche suggerimento...

Potrebbe essere un formato ISO nella forma ordinale "anno (4 cifre), giorni (3 cifre)":
2012015 => 2012 (anno), 015 (cioè 15 giorni dall'inizio dell'anno) => 15-01-2012

Potrebbe essere un formato ISO nella forma completa "anno (4 cifre), mese (2 cifre), giorno (2 cifre)", che però hai riportato in modo sbagliato qui sul forum (posso pensare che ti sei dimenticato una cifra):
20120105 => 2012 (anno), 01 (mese), 05 (giorno del mese) => 05-01-2012

Potrebbe essere un formato comune nella forma "giorno (2 cifre), mese (2 cifre), anno (4 cifre)", che però hai riportato in modo sbagliato (come per l'ipotesi precedente):
20122015 => 20 (giorno), 12 (mese), 2015 (anno) => 20-12-2015

Potrebbe essere un formato "...meno" comune, in cui l'anno è indicato con 3 cifre:
2012015 => 20 (giorno), 12 (mese), 015 (anno) => 20-12-2015

Potrebbe essere un formato comune ma nella forma americana "mese (2 cifre), giorno (2 cifre), anno (4 cifre)", che però (solita storia) magari hai sbagliato riportandolo sul forum:
02012015 => 02 (mese), 01 (giorno), 2015 (anno) => 02-01-2015

Se rientri nelle prime due ipotesi, potresti risolvere con una cosa del genere:

PHP:
$datainput = "2012015"; // equivale a "20120115"
$dataoutput = date('d-m-Y', strtotime($datainput));
echo $dataoutput;



Ciao, la data in entrata è 2-01-2015, il (2 gennaio 2015), il formato che vorrei ottenere è "00-00-0000", oppure andrebbe bene anche così "0-00-0000", praticamente da stringa "2012015" vorrei diventasse data "2-01-2015" quando importo il file txt in tabella.

Grazie
Max61
 
Ultima modifica:
Bene. Quindi, nella data in entrata, il valore del giorno ha un numero variabile di cifre (cioè una o due cifre), giusto?
Giusto per puntualizzare, in questo caso, dove non sono presenti dei caratteri separatori che distinguono le varie parti della data, direi che per convenzione (dettata dalla logica di utilizzo) è sempre consigliabile mantenere un numero fisso di cifre (anteponendo quindi lo 0 per i valori minori di 10), proprio per non incorrere a possibili situazioni di ambiguità, come in questo specifico caso.
Il formato usato nel tuo file txt mi sembra poco logico/fruibile/condivisibile.

Ad ogni modo, appurato che il formato in entrata sia "gmmaaaa" oppure "ggmmaaaa", puoi risolvere in svariati modi.

Usando le apposite funzioni per la manipolazione di oggetti di tipo data:
PHP:
$datainput = "2012015";
$datainput = sprintf("%08d", $datainput); // se necessario, aggiunge lo 0 davanti
$dataoutput = date_format(date_create_from_format("dmY", $datainput), "j-m-Y"); // oppure 'd-m-Y' per il giorno con 2 cifre fisse
echo $dataoutput;

Usando un'espressione regolare per ottenere le varie parti della stringa e "ricostruirla" opportunamente:
PHP:
$datainput = "2012015";
$datainput = sprintf("%08d", $datainput); // se necessario, aggiunge lo 0 davanti
$dataoutput = preg_replace("/^(\d{2})(\d{2})(\d{4})$/", "\1-\2-\3", $dataoutput);
echo $dataoutput;

Usando delle semplici funzioni replace per inserire opportunamente i caratteri separatori voluti:
PHP:
$datainput = "2012015";
$datainput = sprintf("%08d", $datainput); // se necessario, aggiunge lo 0 davanti
$dataoutput = substr_replace(substr_replace($datainput, "-", -6, 0), "-", -4, 0);
echo $dataoutput;

Sicuramente ci sono anche altri modi. Vedi se uno di questi può andarti bene.


PS: Ti prego, non rispondere citando l'intero post se non è necessario. Grazie.
 
Perfetto, sei un genio!
Le soluzioni da te prospettate vanno benissimo, in uscita le date sono corrette, sia da 1 a 9 che maggiori.
Adesso dovrei (se possibile) modificare le stesse anche nel db, per fare le query che comprendono anche le date, è possibile?

Ho 3 colonne con le date:
datanascitafiglio
datanascitapadre
datanascitamadre

O le posso vedere giuste soltanto in visualizzazione?

Grazie
Max61
 
Nel db converrebbe avere dei campi di tipo "DATE". Il formato è "aaaa-mm-gg" che è lo standard. A quel punto, quando prelevi tali valori per usarli nelle tue applicazioni, potrai formattarli con DATA_FORMAT().

Hai già importato i dati o devi ancora importarli?
 
Li ho già importati, ma li posso importare di nuovo.
I campi data adesso li ho messi VARCHAR altrimenti il valore importato era 0000-00-00
Però posso cambiarli in formato data e poi importare di nuovo il file.

Grazie Max61
 
Prova in questo modo. Lascia pure i dati come già li hai importati ed applica una query del genere per aggiustarli:

Codice:
UPDATE tabella 
SET campo1 = STR_TO_DATE(LPAD(campo1, 8, '0'), '%d%m%Y'), 
    campo2 = STR_TO_DATE(LPAD(campo2, 8, '0'), '%d%m%Y'), 
    campo3 = STR_TO_DATE(LPAD(campo3, 8, '0'), '%d%m%Y');

Non l'ho testato ma in sostanza dovrebbe convertire le varie date secondo il formato standard.
A questo punto puoi cambiare i campi da VARCHAR a DATA... puoi utilizzare l'istruzione ALTER TABLE.

Fatto questo potrai recuperare tali dati e convertirli come meglio ti pare attraverso le apposite funzioni per la manipolazione delle date.
 
Prova in questo modo. Lascia pure i dati come già li hai importati ed applica una query del genere per aggiustarli:

Codice:
UPDATE tabella 
SET campo1 = STR_TO_DATE(LPAD(campo1, 8, '0'), '%d%m%Y'), 
    campo2 = STR_TO_DATE(LPAD(campo2, 8, '0'), '%d%m%Y'), 
    campo3 = STR_TO_DATE(LPAD(campo3, 8, '0'), '%d%m%Y');

Non l'ho testato ma in sostanza dovrebbe convertire le varie date secondo il formato standard.
A questo punto puoi cambiare i campi da VARCHAR a DATA... puoi utilizzare l'istruzione ALTER TABLE.

Fatto questo potrai recuperare tali dati e convertirli come meglio ti pare attraverso le apposite funzioni per la manipolazione delle date.


Buongiorno e ancora grazie per le dritte che mi stai dando.
Ho lanciato la query update che mi hai postato ma le date rimangono identiche a prima, cioè es.:21011975, non diventa 21-01-1975, almeno io ho capito che dovevano diventare così.
La query update la lancio quando ancora i campi sono VARCHAR, è corretto?
Se sbaglio qualcosa fammelo notare.
Grazie
Max61
 
Ciao,
no, il formato deve essere quello standard richiesto per il tipo di campo "DATE" ("YYYY-MM-DD" vedi manuale), cioè 21011975 alla fine, sul db, dovrà risultare 1975-01-21 così da poter usare il tipo "DATE". Questo è il modo più consono di immagazzinare delle date sul db perché saranno trattate propriamente per ciò che sono, e potrai usare tutte le relative funzioni per manipolare i dati e interrogare il db in maniera opportuna. Chiaramente, quando andrai a prelevare queste date dal db, dovrai convertirle opportunamente nel formato che meglio preferisci. Ad esempio, potrai fare una SELECT applicando DATE_FORMAT().

Non so perché la query non funzioni.
In sintesi:
LPAD() serve ad aggiungere lo 0 iniziale la dove dovesse mancare.
STR_TO_DATE()
serve per convertire la stringa in un valore di tipo "DATE". La stringa deve essere composta secondo il formato indicato, in questo caso "%d%m%Y" (vedi la tabella riportata sul manuale)

La query update la lancio quando ancora i campi sono VARCHAR, è corretto?
Sì, corretto. Prima di cambiare il tipo di campo in "DATE", è appunto necessario formattare i dati per essere considerati come date valide, altrimenti otterresti "0000-00-00", come già hai constatato.
 
Ciao,
no, il formato deve essere quello standard richiesto per il tipo di campo "DATE" ("YYYY-MM-DD" vedi manuale), cioè 21011975 alla fine, sul db, dovrà risultare 1975-01-21 così da poter usare il tipo "DATE". Questo è il modo più consono di immagazzinare delle date sul db perché saranno trattate propriamente per ciò che sono, e potrai usare tutte le relative funzioni per manipolare i dati e interrogare il db in maniera opportuna. Chiaramente, quando andrai a prelevare queste date dal db, dovrai convertirle opportunamente nel formato che meglio preferisci. Ad esempio, potrai fare una SELECT applicando DATE_FORMAT().

Non so perché la query non funzioni.
In sintesi:
LPAD() serve ad aggiungere lo 0 iniziale la dove dovesse mancare.
STR_TO_DATE()
serve per convertire la stringa in un valore di tipo "DATE". La stringa deve essere composta secondo il formato indicato, in questo caso "%d%m%Y" (vedi la tabella riportata sul manuale)


Sì, corretto. Prima di cambiare il tipo di campo in "DATE", è appunto necessario formattare i dati per essere considerati come date valide, altrimenti otterresti "0000-00-00", come già hai constatato.




Ciao sto provando ancora a lanciare la query che mi hai postato, ma non succede nulla, quindi penso di sbagliare qualcosa e per questo ti invio la query che lancio:
PHP:
$query ="UPDATE tblp4 
	SET datanasfiglio = STR_TO_DATE(LPAD(datanasfiglio, 8, '0'), '%d%m%Y'), 
    datanaspadre = STR_TO_DATE(LPAD(datanaspadre, 8, '0'), '%d%m%Y'), 
    datanasmadre = STR_TO_DATE(LPAD(datanasmadre, 8, '0'), '%d%m%Y')";

è corretta?

Grazie Max61
 
Ciao, posso dirti che il codice sql sembra corretto. Bisogna capire come stai lanciando la query e se non ci siano errori di altro genere.
 
Ciao, posso dirti che il codice sql sembra corretto. Bisogna capire come stai lanciando la query e se non ci siano errori di altro genere.


Hai ragione, ho rifatto la pagina che lancia la query e adesso funziona, probabilmente non veniva effettuata la query UPDATE.

Grazie di tutto il supporto che mi hai dato!!!:beer:

Max61
 

Discussioni simili