|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2696
|
[VB2010] - Operazioni con le date
Salve ragazzi,
mi sorge un dubbio. La mia applicazione salva su un database di Access alcuni valori tra cui una data che a livello di TextBox formatto nel formato (yyyy/mm/dd hh.mm.ss.) Quando però visualizzo il dato aprendo il database questa data appare nel formato dd/mm/yyyy hh.mm.ss cioè per capirci a livello di TextBox il formato è 2010/11/19 18.02.47 ma nel database visualizzo 19/11/2010 18.02.47 Sicuramente la visualizzazione su Access dipende dalle impostazioni internazionali di sistema e quindi mi chiedo se questo database su un sistema diverso dal mio con impostazioni internazionali ad esempio americane visualizzerà correttamente le date anche a livello di operazioni con le date. Non vorrei che se dovessi fare una sottrazione di date create su due sistemi con opzioni internazionali ottengo valori strani... Mi chiarite il dubbio? Grazie
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
In Access, come in qualsiasi altro DB il tipo DATA "non esiste".
A livello di memorizzazione esiste solo un numero. Nel caso di Access è un Long. Perciò il tipo Data/Ora, quando ad esempio apri in visualizzazione diretta una tabella Access, in realtà è già una rappresentazione "astratta" di quanto in realtà è scritto nel DB. Se carichi una data da Access in VB.NET, tranquillo. Il valore è sempre quello, e non dipende da impostazioni o da formattazioni...
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2696
|
Grazie per il tuo prezioso supporto.
Ti chiedo adesso come sviluppare questa query: Codice:
SELECT * FROM [MiaTabella] WHERE Creazione = 'Data di oggi' Grazie ancora!
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Anzitutto una correzione a quanto ho scritto : nelle nuove versioni di Access ( credo dalla 2000 in poi... ) il tipo data viene memorizzato come valore numerico Double ( non più Long, quindi ).
Il discorso è abbastanza semplice. Poniamo di avere una Tabella con 2 campi : - campo_data_generica : formato data generica - aaaa/mm/gg hh/mm/ss - campo_data_in_cifre : formato data in cifre - aaaa/mm/gg 1. Creo una data estesa in VB e faccio la INSERT in campo_data_generica : Codice:
Dim D As New DateTime(2010, 11, 22, 0, 0, 0) Codice:
Dim D As New DateTime(2010, 11, 22) Codice:
Dim D As New DateTime(2010, 11, 22, 12, 30, 45) 1. SELECT restituisce 40504 2. SELECT restituisce sempre 40504 3. SELECT restituisce 40504,521354...... Perciò inserire o leggere una data estesa con ore/min/sec = 0/0/0 equivale a inserire/leggere una data semplice, senza specificare la parte oraria. Bisognerebbe inoltre notare che nel Double restituito da .ToOADate() ci sono anche i millisecondi... Detto questo, agisci di conseguenza...
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2696
|
...ma perchè non è possibile utilizzare una funzione di conversione all'interno della Select?
Quì c'è un esempio interessante: http://www.sqlusa.com/bestpractices/datetimeconversion/ Cioè poniamo il caso di avere una tabella così fatta: ![]() Vorrei realizzare una Select in modo da visualizzare solo i record con DataCreazione uguale a 22/11/2010: Codice:
SELECT * FROM [MiaTabella] WHERE DataCreazione = 'Data di oggi'
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
Ultima modifica di lucausa75 : 22-11-2010 alle 10:12. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2696
|
...alla fine senza utilizzare alcuna conversione ho ragionato sull' intervallo di durata di una data ed ecco la mia stringa SQL:
Codice:
SELECT * FROM [" & TB & "] WHERE Creazione >= #" & Today & " 00.00.00# AND Creazione <= #" & Today & " 23.59.59#
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
|
|
|
|
|
|
#7 | ||
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
L'Sql di Access non è detto che le digersica. Che io sappia CONVERT non è supportato. DATEPART restituisce stringhe, quindi si ricade nel problema delle impostazioni locali, formattazioni... Se mi devo gestire separatamente Anno, Mese e Giorno a questo punto uso 3 OledbParameters, non certo 3 direttive DATEPART concatenate. Quote:
1. Come già detto, confronto la data "a pezzi", con 3 Parameters per Anno, Mese, Giorno. Forse un po' prolissa, ma sicura al 100%. 2. Uso la Function Access DATEVALUE(). Penso che al 99% non dia sorprese, con qualsiasi impostazione/formattazione : Codice:
Dim dataConfronto As New DateTime(2010, 11, 22)
Dim strSql As String = "SELECT DataCreazione FROM T_Libri WHERE DATEVALUE(DataCreazione)=@dataConfronto"
Using CN As New OleDb.OleDbConnection(strCN)
Using CMD As New OleDb.OleDbCommand(strSql, CN)
'Assegnazione Parametri :
CMD.Parameters.Add("@dataConfronto", OleDb.OleDbType.Date)
CMD.Parameters("@dataConfronto").Value = dataConfronto
'SELECT
CN.Open()
Dim RDR As OleDb.OleDbDataReader = CMD.ExecuteReader
While RDR.Read
'...
End While
End Using
End Using
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
||
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Molto meglio con DATEVALUE().
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2696
|
Proverò col DateValue e dopo ti offrirò un birra...virtuale!
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2696
|
...con DateValue nel mio caso specifico mi da errore "Data type mismatch in criteria expression"
Codice:
SELECT * FROM [" & TB & "] WHERE DATEVALUE(DataCreazione) = #" & Today & "#"
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Credo sia dovuto al fatto che DATEVALUE restituisce una stringa, NON una data. Il fatto è che con il mio sistema, il Parameter beneficia del casting implicito di VB, mentre concatenando come fai tu, NO. Un motivo in più per passare ai Parameters.
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2696
|
Quote:
OK, prossimo studio sarà passare ai Parameters Quindi per adesso penso vada bene la soluzione adottata dato che non faccio uso ancora dei Parameters? Codice:
SELECT * FROM [" & TB & "] WHERE Creazione >= #" & Today & " 00.00.00# AND Creazione <= #" & Today & " 23.59.59#
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
|
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Le uniche situazioni in cui si può tollerare la brutale concatenazione sono quelle estremamente semplici, come questa : Codice:
"SELECT * FORM Tabella WHERE ID=" & numero Quella soluzione "intermedia" non mi piace per niente. Poi, uomo avvisato...
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2696
|
Quote:
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
|
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2696
|
Salve ragazzi,
riporto su questo argomento perchè volevo capire due cosette riguardo Access: 1) Utilizzando le query il formato delle date deve essere di tipo MM/dd/yyyy (Esempio 8 Dicembre 2010 diventa 12/08/2010)? 2) Se la data comprende anche la parte oraria questa deve essere separata dal punto (.) o dal due punti ( Vi faccio questa domanda perchè ho problemi nell'effettuare delle query di confronto di date all'interno di questo database che vi invito a fare e a correggere Query 1 (Non da alcun risultato ma filtrando "a vista" i record ci sono): Codice:
SELECT [Elenco Libri].* FROM [Elenco Libri] WHERE ((([Elenco Libri].Created)=#11/26/2010#)) Codice:
SELECT [Elenco Libri].* FROM [Elenco Libri] WHERE ((([Elenco Libri].Created)>#11/26/2010#)) Codice:
SELECT [Elenco Libri].* FROM [Elenco Libri] WHERE ((([Elenco Libri].Created)>=#11/26/2010#)) Codice:
SELECT [Elenco Libri].* FROM [Elenco Libri] WHERE ((([Elenco Libri].Created)<#11/26/2010#)) Codice:
SELECT [Elenco Libri].* FROM [Elenco Libri] WHERE ((([Elenco Libri].Created)<=#11/26/2010#)) Codice:
SELECT [Elenco Libri].* FROM [Elenco Libri] WHERE ((([Elenco Libri].Created)<>#11/26/2010#)) Grazie
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
Ultima modifica di lucausa75 : 09-12-2010 alle 07:29. |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
2) "#MM/DD/YYYY hh:mm:ss#". Al momento non so se accetti anche il punto come separatore orario, perchè è davvero una vita che non inserisco date in questo modo... Accorgimenti ? - MAI usare spazi nei nomi di qualunque entità di un DataBase. Codice:
SELECT [Elenco Libri].* FROM [Elenco Libri] WHERE ((([Elenco Libri].Created)=#11/26/2010#)) E poi sei costretto ad usare pure un mucchio di parentesi : Elenco_Libri, ElencoLibri, ma MAI [Elenco Libri] ! - Usare i parameters ( ultima volta nella vita che te lo ripeto, giuro Prendi solo la prima query e ripensala così : Codice:
SELECT * FROM Elenco_Libri WHERE Created=@parametroData
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2696
|
Quote:
Questa Codice:
SELECT [Elenco Libri].* FROM [Elenco Libri] WHERE ((([Elenco Libri].Created)=#11/26/2010#)) Ma perchè la @ dopo parametroData? Cmq io mi riferivo direttamente ad Access nella sezione Query
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
Ultima modifica di lucausa75 : 08-12-2010 alle 15:58. |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
La @ è una convenzione generalmente accettata, che a me piace molto. Di solito la variabile-parametro prende il nome dal campo che deve mappare. Anteponendo un carattere speciale si evitano errori e inoltre tutto risulta più leggibile : Codice:
...
Dim strSql As String = "SELECT * FROM nomeTabella WHERE nome=@nome"
...
...
CMD.Parameters.Add("@nome", OleDb.OleDbType.VarChar)
...
Codice:
...
Dim strSql As String = "SELECT * FROM nomeTabella WHERE nome=§nome"
...
...
CMD.Parameters.Add("§nome", OleDb.OleDbType.VarChar)
...
Se usi dollaro ( $nome ) : Errore.
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2696
|
Quote:
Ottima spiegazione ma se volessi creare una query quelle indicate nel mio post internamente da access come dovrei fare? Come scritto pare abbiaano dei problemi...
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
|
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Sicuramente questa in Access è corretta :
Codice:
SELECT * FROM nome_tabella WHERE campo_data=#11/26/2010#
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:14.




















