Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    55

    java e db sqlite - problemi con query che utilizzano tipo DATE

    Ragazzi ho un problema con i db sqlite

    In un programma scritto in java , quando faccio una ricerca in un certo intervallo di date , la query non da i risultati che dovrebbe dare utlizzando il formato data dd/mm/yyyy , ma non da errori in compilazione. Anche quando in fase di inserimento dati , inserendo i dati di tipo DATE in quel formato non da alcun errore. Cosa invece che succede in db my sql se sbagli il formato della data che nel caso di mysql è yyyy-mm-dd .

    Da quello che ho capito il formato che utilizzo è sbagliato per db sqlite. Qual'è il formato corretto ?

    Grazie in anticipo

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    147
    SQLite non prevede i tipi DATE, DATETIME e TIMESTAMP come MySQL e in generale ogni DBMS può avere il suo set di tipi predefiniti con i propri range... Quindi, per sicurezza, andrebbe sempre dato uno sguardo alla documentazione in merito dello specifico DBMS... Di certo il compilatore Java non ti va a controllare le istruzioni sql che "incapsuli" nelle stringhe, per questo in compilazione non hai errori... Comunque tornando a SQLite dovresti scegliere un metodo che vada bene per le tue esigenze; ad esempio nelle mie applicazioni mi è sempre convenuto creare un campo di tipo INTEGER dove memorizzare il timestamp in millisecondi (Unix time) con cui fare facilmente tutte le operazioni di confronto... Se poi ti occorre mostrarlo in un formato comprensibile (ad esempio file o interfaccia grafica) scrivi 2 istruzioni utilizzando le classi Date e SimpleDateFormat.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    55
    grazie per aver risposto dalla documentazione che ho consultato prima di utilizzare questo dbms ... mi risulta che esiste un tipo di dati DATE, altrimenti non l'avrei utilizzato.

    quando creo una tabella del db ad esempio :

    codice:
    stat.executeUpdate("CREATE TABLE vendita (id_f INTEGER PRIMARY KEY,num INTEGER,data DATE,ditta VARCHAR(100))");
    se è vero quello che dici tu , che i tipi DATE non esistono.. perchè quando scrivo in quella tabella un valore data me lo scrive e quando eseguo una semplice SELECT * , me lo legge anche???

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    55
    aiutami a capire...

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Leggo da qui:

    http://www.sqlite.org/datatype3.html

    1.2 Date and Time Datatype

    SQLite does not have a storage class set aside for storing dates and/or times. Instead, the built-in Date And Time Functions of SQLite are capable of storing dates and times as TEXT, REAL, or INTEGER values:

    TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS").
    REAL as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar.
    INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC.
    Applications can chose to store dates and times in any of these formats and freely convert between formats using the built-in date and time functions.
    quindi mi pare di capire che non troverai un tipo DATE, DATETIME, TIMESTAMP come in MySQL o simili, ma che puoi salvare il dato in formato testuale (o intero o come ti pare, purché ammesso) e sfruttare le funzioni messe a disposizione per fare quelle che devi fare - dovessero servire.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    55
    Grazie tante Andrea! lo leggerò attentamente e capiro' dove sbaglio e come risolvere il problema.

    Il Date abbiamo capito che non esiste.. ma voglio capire.. nell'esempio di codice postato su , perchè funziona sia inserimento che lettura se il tipo Date non esiste e dovrebbe dare errore?

    Nel programmma va tutto bene , ottengo risultati sbagliati di query quando voglio dei dati in un certo intervallo di date da me inserite

    esempio frazione codice :
    codice:
    WHERE data >= ('" + dal.getText() + "') AND data <= ('" + al.getText() + "')

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    tu dici che la creazione della tabella va a buon fine? Mi pare strano, a leggere la documentazione.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    55
    si quello è il problema strano... minimo 10 tabelle sono state create con DATE e in creazione , lettura e scrittura nessun problema, infatti usiamo il programma tranquillamente. Durante il test ho scoperto che nella ricerca per data non va qualcosa utlizzando quel tipo di query che ho scritto poco fà :-s

    Comunqua io utilizzo la versione embedded del db , me lo crea a runtime appena lancio il programma, naturalmente controllando se nn esiste gia Non so se cambia qualcosa ..

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    55
    Andrea ho capito cosa succede ho fatto un'esperimento
    ho creato una tabella di prova con all'interno oltre alla chiave primaria , un campo di tipo GUA (iniziali mio cognome che nn esiste naturalmente) .
    E come per il campo DATE sia in scrittura che in lettura , mi inserisce e legge un dato in quel campo che non esiste.

    Praticamente sqlite quando trova un tipo che non esiste , lui automaticamente lo trasforma nel tipo di default VARCHAR.

    non ci sono altre spiegazioni

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    147
    Effettivamente SQLite accetta il tipo DATE e DATETIME per una sorta di compatibilità con altri DBMS, ma non li tratta come tipi "atomici" bensì li converte in uno dei suoi tipi secondo queste regole. Quindi un dato di tipo DATE viene convertito in NUMERIC e te lo tratta come tale (se fai una insert con un valore 2012-06-08 il DBMS inserisce 1998, ossia la differenza). Probabilmente è questa la causa dei comportamenti sospetti che ti ritrovi... Come già scritto ti consiglio di "adattarti" ai tipi di default di SQLite e implementare una tuo metodo (ad esempio timestamp numerici), altrimenti se proprio non vuoi rinunciare al tipo DATE devi utilizzare nelle tue insert anche queste funzioni. Ad esempio:

    insert into tabella values (1,strftime('%Y-%m-%d','2012-06-08'))

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.