Strano problema con le date, cast e convert falliscono

lunedì 01 giugno 2009 - 12.47

sanzo77 Profilo | Newbie

Salve a tutti,
Eccomi ancora qui a chiedere il vostro aiuto. Come forse alcuni di voi già sanno estraggo dati da un AS400 e li interrogo su un sql server. Al momento sono incappato in un problema relativo alle date che mi lascia un pò perplesso. Descrivo il problema:
Il sistema che gira su AS400 salva le date in formato numerico (es. 20090101), grazie agli strumenti dell'integration services di Sql server io estraggo i dati in forma numerica e li inserisco in una tabella sql server sotto forma di varchar(8). A questo punto mi aspetterei di utilizzare convert o cast o cast impliciti senza problemi e di poter confrontare i dati estratti ad esempio nei confronti di un getdate().
Invece quello che ottengo è sempre il messaggio: Conversione non riuscita durante la conversione di una stringa di caratteri in una data o ora.

Qualcuno ha idea di come potrei venirne fuori?

Grazie

alx_81 Profilo | Guru

>Salve a tutti,
Ciao

>Eccomi ancora qui a chiedere il vostro aiuto. Come forse alcuni
>di voi già sanno estraggo dati da un AS400 e li interrogo su
>un sql server. Al momento sono incappato in un problema relativo
>alle date che mi lascia un pò perplesso. Descrivo il problema:
>Il sistema che gira su AS400 salva le date in formato numerico
>(es. 20090101), grazie agli strumenti dell'integration services
>di Sql server io estraggo i dati in forma numerica e li inserisco
>in una tabella sql server sotto forma di varchar(8). A questo
>punto mi aspetterei di utilizzare convert o cast o cast impliciti
>senza problemi e di poter confrontare i dati estratti ad esempio
>nei confronti di un getdate().
ma dove devi fare i confronti? su SSIS o in t-sql?

>Grazie
di nulla!

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

sanzo77 Profilo | Newbie

su t-sql

alx_81 Profilo | Guru

>su t-sql
fammi vedere l'istruzione che cerchi di fare.
come fai a comporla?

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

lbenaglia Profilo | Guru

>Il sistema che gira su AS400 salva le date in formato numerico
>(es. 20090101), grazie agli strumenti dell'integration services
>di Sql server io estraggo i dati in forma numerica e li inserisco
>in una tabella sql server sotto forma di varchar(8).

Perché memorizzi le date in una stringa?
SQL Server offre i data type datetime, smalldatetime e se usi SQL Server 2008 date per memorizzare le date.

>A questo
>punto mi aspetterei di utilizzare convert o cast o cast impliciti
>senza problemi e di poter confrontare i dati estratti ad esempio
>nei confronti di un getdate().
Ecco, se utilizzi i data type corretti non hai bisogno di eseguire alcun cast.

>Qualcuno ha idea di come potrei venirne fuori?
Posta un esempio completo che riproduca il problema.

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

sanzo77 Profilo | Newbie

Allora, l'ultimo step che ho seguito è questo:
In Integration Services costruisco il campo datascadenza nel seguente modo:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Ovvero a partire da DATFVI, che su AS400 è un numerico, prima lo casto a stringa, poi gli faccio un substring per suddividerlo in anno, mese e giorno, infine concateno i risultati intervallandoli con i trattini.
Nota che subito prima di questo step utilizzavo anche la costruzione della stringa senza trattini e con il tipo dati varchar(8) sul DB di destinazione:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Il caricamento dati va a buon fine, ad esempio il primo record di una select * è:
codpro codact uvc colli datagiacenza datascadenza MUBE00240 ELI 72 12 2009-06-01 00:00:00.000 2009-10-05
Notare che la data giacenza è differente dalla datascadenza perchè viene inserita direttamente con un getdate

Poi provo a fare una select da sql server:
SELECT * FROM giacenze where convert(datetime,datascadenza,112) = GETDATE()
quello che ottengo è l'errore di cui sopra

sanzo77 Profilo | Newbie

Per rispondere a lbenaglia:
Lo inserisco come stringa perchè SSIS non riesce a farmi il cast da numerico a tipo data. L'unico modo che ho trovato è stato quello di passare al tipo stringa per riuscire a caricare i dati sul DB.

lbenaglia Profilo | Guru

>Ovvero a partire da DATFVI, che su AS400 è un numerico, prima
>lo casto a stringa, poi gli faccio un substring per suddividerlo
>in anno, mese e giorno, infine concateno i risultati intervallandoli
>con i trattini.
Togli i trattini in modo da avere il formato YYYYMMDD.
Che versione di SQL Server utilizzi?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

sanzo77 Profilo | Newbie

Sto provando in questo momento ad eseguire la seguente cosa:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
ma quello che ottengo in fase di caricamento dati da SSIS è [Aggiungi colonna data tramite getdate [154]] Errore: Errore durante il tentativo di esecuzione di un cast di tipo.

Edito per dire che utilizzando un tipo data di cast diverso ovvero: (DT_DATE)DATFVI in SSIS riesco a superare il punto in cui mi si genera l'errore di cast, purtroppo però va poi in errore in fase di inserimento del dato su sql server dicendo : "Impossibile eseguire la conversione. Overflow del valore di dati rispetto al tipo specificato.".
Il campo di destinazione è definito come datetime

Aggiorno di nuovo dando la pseudo-soluzione della questione: il SSIS andava in errore perchè il sistema AS400 da cui prendo i dati aveva alcune date di scadenza = 0. Questo ovviamente fa andare in errore il convertitore di SSIS. Attualmente ho deciso comunque di estrarre i dati come stringa (invece che come data) infatti l'informazione data di scadenza = 0 non va persa perchè rappresenta un problema da fixare.
Ringrazio tutti per l'aiuto ^^

Devil Profilo | Junior Member

ciao,
sono in una situazione molto simile. Ho un file generato da un AS400, un'anagrafica dipendenti per essere preciso, in cui naturalmente ci sono delle date. Prendiamo ad esempio la data di assunzione che sappiamo essere nel formato yyyymmgg.

Io devo semplicemente leggere i dati dal file di testo (flat file source) manipolarli (derived colum) e inserirli in una tabella SQL (Ole DB destination)

Assodato il fatto che il campo della mia tabella di destinazione è di tipo "datetime" quello che non capisco è come devo settare il tipo delle colonne del flat file in input e in output, se devo fare delle conversioni attraverso il derived colum o meno per non avere errore

Ho fatto diverse prove ma non trovo le corrette impostazioni per il tipo di dato nei vari passaggi.

Leggendo tra i vari post ho notato che qualcuno imposta a stringa i valori del FFS e poi con un'espressione esegue le varie concatenazioni anche se a volte con qualche errore. Mi sembra un pò articolato, è davvero l'unico modo?

Sperando di essere stato chiaro, sapreste darmi qualche indicazione?
Grazie
ciao

lbenaglia Profilo | Guru

>Ho un file generato da un
>AS400, un'anagrafica dipendenti per essere preciso, in cui naturalmente
>ci sono delle date. Prendiamo ad esempio la data di assunzione
>che sappiamo essere nel formato yyyymmgg.

Ciao,

una stringa contenente una data nel formato YYYYMMDD può essere implicitamente (o esplicitamente) castata a date:

SELECT CAST('20110908' AS date) AS Data; /* Output: Data ---------- 2011-09-08 (1 row(s) affected) */

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

Devil Profilo | Junior Member

ciao,
si ma con nel SSIS con cosa lo si fa ? con il data convert? con il derivate colum?

non ci sono riuscito!

come mi indichi tu devo usare un sql command

Per ovviare al problema ho fatto come tanti altri con il substring ma mi sembra strano che non ci sia un elemento apposito
Grazie
ciao

alx_81 Profilo | Guru

>ciao,
>si ma con nel SSIS con cosa lo si fa ? con il data convert? con il derivate colum?
data convert o derived column.. corretto.
in una derived column devi usare una stringa simile a questa:

(DT_DBTIMESTAMP)campo_di_partenza

vedi qui un link utile per i cast possibili: http://msdn.microsoft.com/it-it/library/ms141704.aspx

>Grazie
di nulla!

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5