Problema con date importate da file txt

Max61

Utente Attivo
2 Mar 2014
707
3
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
 

WmbertSea

Utente Attivo
28 Nov 2014
207
32
28
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;
 

Max61

Utente Attivo
2 Mar 2014
707
3
18
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:

WmbertSea

Utente Attivo
28 Nov 2014
207
32
28
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.
 

Max61

Utente Attivo
2 Mar 2014
707
3
18
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
 

WmbertSea

Utente Attivo
28 Nov 2014
207
32
28
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?
 

Max61

Utente Attivo
2 Mar 2014
707
3
18
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
 

WmbertSea

Utente Attivo
28 Nov 2014
207
32
28
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.
 

Max61

Utente Attivo
2 Mar 2014
707
3
18
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
 

WmbertSea

Utente Attivo
28 Nov 2014
207
32
28
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.
 

Max61

Utente Attivo
2 Mar 2014
707
3
18
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
 

WmbertSea

Utente Attivo
28 Nov 2014
207
32
28
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.
 

Max61

Utente Attivo
2 Mar 2014
707
3
18
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
Autore Titolo Forum Risposte Data
V [MySQL] problema query con date su server MySQL 5
A Problema con "explode" su campo date PHP 9
S Problema con date in php PHP 2
F Problema formattazione data e creazione array con nuove date Javascript 2
A Problema con date () e database PHP 7
T Problema: Confronto date con Mysql PHP 3
G problema con date('His') PHP 5
M [PHP] calendario con eventi problema con date PHP 9
O problema con Dreamweaver, Access e date MS Access 0
H Problema Con Le Date E L'ora Classic ASP 1
T PROBLEMA CON SESSIONI PHP 3
T ALTRO PROBLEMA CON ARRAY PHP PHP 1
T PROBLEMA CON ARRAY PHP 8
L problema con query select PHP 2
R Problema query con ricerca id numerico PHP 2
F Problema con risposta PHP 0
S problema con recupero dati tabella mysql PHP 2
Z Problema con il mio tp-l i nk Reti LAN e Wireless 1
L Problema RAM con Tomcat 8 Apache 0
napuleone problema con sort e asort PHP 4
Z Problema con INT MySQL PHP 1
Z Problema database MySQL con XAMPP PHP 0
M Problema con controllo form in real time jQuery 6
Z Problema di sincronizzazione PAYPAL con PHP PHP 1
G Problema con Get page PHP 4
P Problema con require once PHP 6
P Problema con i package Java 1
A Problema login con Safari PHP 14
F INDESIGN: problema esportazione esecutivo per la stampa con foto B/N Webdesign e Grafica 1
S problema con css bootstrap3 HTML e CSS 4
M .load() problema con caricamenti dinamici di js Javascript 0
G Problema ------- con Query PHP 1
G Problema con Query PHP 1
T problema con select dinamica con jquery Javascript 0
S Problema con spazi bianchi HTML e CSS 4
A PROBLEMA: insert mysqli con dati Tagsinput Presentati al Forum 0
Tommy03 Problema con z-index HTML e CSS 3
M Problema inserimento parole con apostrofo nel db PHP 5
C Problema con dati meteo xml XML 1
S Problema con infrarossi videocamera IP Cam e Videosorveglianza 1
V Problema con librerie allegro5 c++ C/C++ 1
M Problema con php per calcolo costo percentuale PHP 7
S Problema con mysqli_num_rows PHP 18
grgfede Problema javascript con aruba Javascript 1
M Problema con visibility e radio button Javascript 2
Marti1! Problema con casella mail cancellata Posta Elettronica 3
L [PHP] Problema con Telegram PHP 1
tomorc [HTML] Problema con scroll bar (risolto) HTML e CSS 0
S Strano problema con i title su Google SEO e Posizionamento 3
P [ASP.Net] Problema ERR_INCOMPLETE_CHUNKED_ENCODING 206 (Partial Content) con Font ASP.NET 4

Discussioni simili