Page 1 of 2 1 2 LastLast
Results 1 to 15 of 17

Thread: Date-time in SQL (zonder Delphi parameters)

  1. #1
    TDelphiDeveloper Baldo's Avatar
    Join Date
    Apr 2002
    Location
    Hellevoetsluis
    Posts
    498

    Question Date-time in SQL (zonder Delphi parameters)

    Ik ben bezig met een set componenten waarmee standaard zoekfunctionaliteit in een applicatie kan worden ingebouwd (zie deze thread of deze pagina). Deze componenten werken voor verschillende databases, maar een groot probleem is dat ik niet met alle databases bekend ben. Een bekend probleemgebied is het verschil in SQL syntax bij vergelijkingen met datum/tijd velden. De datum vergelijkingen en datum+tijd vergelijkingen zijn redelijk te vinden op het internet, maar alleen tijd vergelijkingen zijn moeilijker op te sporen. Wie kan mij helpen met het invullen/controleren van het volgende lijstje zodat mijn documentatie wat beter is en gelijk voor vele NLDelphi bezoekers voor eens en voor altijd het antwoord bekend is?

    De vergelijking moet als het even kan werken ongeacht de landinstellingen van de client en/of server, dus zo universeel mogelijk. Voorbeeld datum/tijd vergelijking: 24 januari 2004, 13:38:08.

    Database: Interbase
    SQL datum: WHERE DatumVeld = '2004-01-24'
    SQL tijd: WHERE DatumVeld = <onbekend>
    SQL datum+tijd: WHERE DatumVeld = '2004-01-24 13:38:08' (milliseconden problemen?)

    Database: MS Sql sever
    SQL datum: WHERE DatumVeld = '20042401'
    SQL tijd: WHERE DatumVeld = <onbekend>
    SQL datum+tijd: WHERE DatumVeld = '20042401133808' (milliseconden problemen?)

    Database: Oracle
    SQL datum: WHERE DatumVeld = '2004-JAN-24'
    SQL tijd: WHERE DatumVeld = <onbekend>
    SQL datum+tijd: WHERE DatumVeld = <onbekend>

    Database: MySQL
    SQL datum: WHERE DatumVeld = '20040124'
    SQL tijd: WHERE DatumVeld = <onbekend>
    SQL datum+tijd: WHERE DatumVeld = '20040124133808' (milliseconden problemen?)

    Database: Access
    SQL datum: WHERE DatumVeld = #01/24/2004#
    SQL tijd: WHERE DatumVeld = <onbekend>
    SQL datum+tijd: WHERE DatumVeld = #01/24/2004 13:38:08#

    Database: Paradox
    SQL datum: WHERE DatumVeld = '01/24/2004'
    SQL tijd: WHERE DatumVeld = <onbekend>
    SQL datum+tijd: WHERE DatumVeld = <onbekend>

    Database: Flash filer
    SQL datum: WHERE DatumVeld = <onbekend> (Richard?)
    SQL tijd: WHERE DatumVeld = <onbekend> (Richard?)
    SQL datum+tijd: WHERE DatumVeld = <onbekend> (Richard?)

    Database: Nexus
    SQL datum: WHERE DatumVeld = <onbekend> (Richard?)
    SQL tijd: WHERE DatumVeld = <onbekend> (Richard?)
    SQL datum+tijd: WHERE DatumVeld = <onbekend> (Richard?)

    Ik weet dat er nog veel meer databases zijn, dus vul gerust aan als je denkt dat er een mist Ik weet ook dat er wellicht sommige al beantwoord zijn op het forum, maar ik heb zoveel gezocht op het internet dat ik het gevoel heb alle pagina's al 10x te hebben gezien en niet meer weet of ik naar iets nieuws zit te kijken.
    Why is it that every time I think I'm holding all the cards, it turns out we're playing chess?
    Download Re-Depend, onmisbaar als je met packages build

  2. #2
    Senior Member walterheck's Avatar
    Join Date
    Oct 2001
    Location
    Belo Horizonte, Brasil
    Posts
    4,212
    Ben ik heel stom als ik zou voorstellen om gewoon parameters te gebruiken? Dan ben je van deze gevoeligheid af. je zult er vast al over nagedacht hebben, dus laat maar horen waar ik over heen denk...
    Nee, de Romeinen spraken geen ISO-8859-1 LATIN

  3. #3
    TDelphiDeveloper Baldo's Avatar
    Join Date
    Apr 2002
    Location
    Hellevoetsluis
    Posts
    498
    Originally posted by walterheck
    Ben ik heel stom als ik zou voorstellen om gewoon parameters te gebruiken? Dan ben je van deze gevoeligheid af. je zult er vast al over nagedacht hebben, dus laat maar horen waar ik over heen denk...
    De componenten bouwen dynamisch SQL op. Dus geen parameters (zoals gemeld). Het parsen van parameters door Delphi verloopt trouwens niet altijd even goed als je dynamisch SQL opbouwt met parameters erin (spreek uit ervaring), dus ook dat is geen optie. Bovendien wil je ook weleens gewoon weten hoe het nou zit met die suffe syntax
    Why is it that every time I think I'm holding all the cards, it turns out we're playing chess?
    Download Re-Depend, onmisbaar als je met packages build

  4. #4
    Senior Member walterheck's Avatar
    Join Date
    Oct 2001
    Location
    Belo Horizonte, Brasil
    Posts
    4,212
    Ik was net klaar met door je source heen scrollen en was net tot die conclusie gekomen Je bent te wakker voor een zondagochtend
    Nee, de Romeinen spraken geen ISO-8859-1 LATIN

  5. #5
    Interbase gaat mis op deze manier. Bij mij werkt wel:

    '2003.02.18'
    '2003.02.18 11:15'
    '2003.02.18 11:14:13'

    Volgens mij is dat ook een universeel formaat, die punten zijn niet mijn landinstellingen.
    Marcel

  6. #6
    En in MySQL werkt dit ook:

    select * from Forum where LastPost > UNIX_TIMESTAMP('2004.01.11 16:00')

    Voor de duidelijkheid: LastPost is in unix timeformat opgeslagen, dus ik moet hem hier even omzetten. Maar het punten-formaat werkt hier dus ook.
    Marcel

  7. #7
    SQL-Server

    Code:
    SELECT     *
    FROM         Orders
    WHERE     (OrderDate BETWEEN '1996.07.04' AND '1996.08.06')
    werkt ook, zal vanavond even de andere varianten van Marcel proberen.

  8. #8
    5th member of nldelphi
    Join Date
    Mar 2001
    Location
    Alkmaar
    Posts
    2,127
    Baldo,
    Hierbij wat info.

    Een Nexus Table met 3 fields

    Field 1: DATUM : TDate
    Field 2: TIJD : TTime
    Field 3: DATUMTIJD : TDateTime

    Waardes:
    Field 1 = 24-01-2004 (waar - afhankelijk is van je DateSeparator ingesteld in je settings van windows)
    Field 2 = 13:38:08 (waar : afhankelijk is van je TimeSeparator ingesteld in je settings van windows)
    Field 3 = 24-01-2004 13:38:08 (waar - en : zie hierboven)

    Onderstaande statements werken allemaal.

    Query's op het DATUM veld:
    --------------------------------
    SELECT * FROM "TableBaldo"
    WHERE
    DATUM = '2004-01-24' {<<<<< ----- Het Officiele Formaat !!! 'YYYY-MM-DD'}

    SELECT * FROM "TableBaldo"
    WHERE
    DATUM = '24-01-2004'

    SELECT * FROM "TableBaldo"
    WHERE
    DATUM = '24-01-04'

    SELECT * FROM "TableBaldo"
    WHERE
    DATUM = date'2004-01-24'



    Query's op het TIJD veld:
    -----------------------------
    SELECT * FROM "TableBaldo"
    WHERE
    TIJD = time'13:38:08' {<<<<< ----- Het Officiele Formaat !!! 'HH:MM:SS'}

    SELECT * FROM "TableBaldo"
    WHERE
    TIJD = time'13.38.08.00' {Mag ook indien de time separtor op . staat ingesteld.}

    SELECT * FROM "TableBaldo"
    WHERE
    TIJD = time'13:38:08.90' {Milliseconden worden niet meegenomen in de query, dus deze query werkt wel.}



    Query's op het DATUMTIJD veld:
    -------------------------------------
    SELECT * FROM "TableBaldo"
    WHERE
    DATUMTIJD ='2004-01-24 13:38:08' {<<<<< ----- Het Officiele Formaat !!! 'YYYY-MM-DD HH:MM:SS'}

    SELECT * FROM "TableBaldo"
    WHERE
    DATUMTIJD ='24-01-2004 13:38:08'

    SELECT * FROM "TableBaldo"
    WHERE
    DATUMTIJD ='24-01-04 13:38:08'

    SELECT * FROM "TableBaldo"
    WHERE
    DATUMTIJD ='2004-01-24 13:38:08.99' {Milliseconden worden niet meegenomen in de query, dus deze query werkt wel.}



    Note: Query's op tijd werken tot op 1 seconden boven het gevraagde dus vb:

    SELECT * FROM "TableBaldo"
    WHERE
    TIJD = time'13:38:07' (GEEN RESULTS)

    SELECT * FROM "TableBaldo"
    WHERE
    TIJD = time'13:38:08' (?ëén record als Result)

    SELECT * FROM "TableBaldo"
    WHERE
    TIJD = time'13:38:09' (?ëén record als Result)


    Verder nog info nodig ? was dit een antwoord op de vraagstelling van hierboven ?
    Zo niet dan hoor ik het wel

    Mvg,

    Richard
    RLD

  9. #9
    Je praat over SQL en ISO/ANSI heeft in de loop der jaren al diverse SQL standaarden uitgebracht. De meeste (zoals het hoort) engines houden zich ook aan deze standaarden. Maak het jezelf gemakkelijk en gebruik dan ook de standaard (als default), zodat je alleen voor de uitzonderen een andere conversie hoeft toe te voegen. Als ik je lijst zo bekijk is alleen Access hier een uitzondering, maar ja dat is ook geen SQL-engine toe noemen, dat is een kladblok met wat extra functionaliteit.
    Helaas zie ik in het forum regelmatig andere formaten aangeraden worden :-(

    Ik heb de SQL standaard even wat voor je vereenvoudigd :
    Code:
    <date value> ::=
      <years value> <minus sign> <months value> <minus sign> <days value>
    
    <time value> ::=
      <hours value> <colon> <minutes value> <colon> <seconds value>
    
    <seconds value> ::=
      <seconds integer value> [ <period> [ <seconds fraction> ] ]
    
    <date string> ::=
      <quote> <date value> <quote>
    
    <time string> ::=
      <quote> <time value> <quote>
    
    <timestamp string> ::=
      <quote> <date value> <space> <time value> <quote>
    M.a.w. een timestamp formaat in een string bouw je op als "YYYY-MM-DD hh:nn:ss.zzz"
    Zowel Firebird, Interbase en MSSQL werken ook met milliseconden, voor Oracle kan ik het zo niet testen, maar dat kan niet missen.

    Groeten,
    Arno
    Nederlandse Firebird Nieuwsgroep
    Hoe meer je weet, hoe meer je beseft hoe weinig je weet.

  10. #10
    TDelphiDeveloper Baldo's Avatar
    Join Date
    Apr 2002
    Location
    Hellevoetsluis
    Posts
    498
    De lijst wordt langzaam maar zeker vollediger... Ik zal als deze compleet is een post doen met de volledige lijst. Tot die tijd: meer meer meer
    Why is it that every time I think I'm holding all the cards, it turns out we're playing chess?
    Download Re-Depend, onmisbaar als je met packages build

  11. #11
    TDelphiDeveloper Baldo's Avatar
    Join Date
    Apr 2002
    Location
    Hellevoetsluis
    Posts
    498
    Hmmm, mijn voorstel voor Access datum+tijd lijkt toch niet te werken. Weet iemand wat het wel moet zijn?
    Why is it that every time I think I'm holding all the cards, it turns out we're playing chess?
    Download Re-Depend, onmisbaar als je met packages build

  12. #12
    Hoi,

    dit werkt in Access

    Code:
    SELECT * 
    FROM ORDERS
    WHERE ORDERS.ShipDate BEWTEEN
    #mm/dd/yyyy uu:nn:ss# AND #mm/dd/yyyy uu:nn:ss#
    Ik met punten geprobeerd, en zonder, de interbase formaten maar die pikt hij niet, dit is de enige manier dat ik er iets uitkrijg met datums. En hij lijkt het goed te doen (gecontroleerd op minuten).

    Hoop dat je hier iets aan hebt.

    Succes

  13. #13
    Senior Member walterheck's Avatar
    Join Date
    Oct 2001
    Location
    Belo Horizonte, Brasil
    Posts
    4,212
    @Arno: haal je dat nog ergens vandaan of komt dat zo uit je blote kop gerold? In het eerste geval is het wel handig om er een link (oid) bij te doen..
    Nee, de Romeinen spraken geen ISO-8859-1 LATIN

  14. #14
    Originally posted by walterheck
    @Arno: haal je dat nog ergens vandaan of komt dat zo uit je blote kop gerold? In het eerste geval is het wel handig om er een link (oid) bij te doen..
    Ja, dit komt uit de laatste ANSI/ISO SQL standaard en is geen verzinsel mijnerzijds :-)
    Het is al reeds in SQL-92 vastgelegd, daarvan heb ik een link gevonden met google dus die link kan ik je wel geven (eigenlijk moet je de standaard kopen) :
    http://dxfania.boom.ru/stuff/sql/docs/sql1992.rar

    Groeten,
    Arno
    Nederlandse Firebird Nieuwsgroep
    Hoe meer je weet, hoe meer je beseft hoe weinig je weet.

  15. #15
    Misschien zinvol voor de Oracle gebruikers om onderstaande hierbij te vermelden, en misschien zijn er op andere Databases ook wel soortgelijke dingen te verzinnen.

    Het probleem is het volgende. Hoe interpreteerd de server een datum die opgegeven wordt als '03-05-2004'. Is dit 3 mei of 5 maart ????
    Dit is afhankelijke van de instellingen op de server. Je pc staat ingesteld op dd-mm-yyyy en de server op mm-dd-yyyy. Om dit nu op te lossen en onafhankelijk te laten zijn van de serverinstellingen is het eenvoudig onderstande query uit te voeren in het begin van je programma:

    DataMod.AtlasORAQuery.SQL.Clear;
    DataMod.AtlasORAQuery.SQL.Add('alter session set nls_date_format = ''dd-mm-yyyy hh24:mi:ss''');
    DataMod.AtlasORAQuery.ExecSQL;

    In de rest van je porgramma kun je dan altijd communiceren met '03-05-2004 17:13:57'

    Ik weet niet of andere databases ook deze optie in zich hebben.
    De beste manier om te leren is door fouten te maken.
    80 procent van alle leugens die jij en ik vertellen blijft onopgemerkt

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. MS SQL database aan maken via Delphi
    By kwakkie in forum Databases
    Replies: 4
    Last Post: 18-Sep-02, 16:58
  2. sql 2000 cursors + delphi
    By Acid Burn in forum Databases
    Replies: 3
    Last Post: 14-Jun-02, 00:32
  3. Simpel SQL in Delphi
    By The Mean One in forum Algemeen
    Replies: 1
    Last Post: 04-Jun-02, 11:00
  4. sql database benaderen in delphi
    By egerlich in forum Databases
    Replies: 6
    Last Post: 22-May-02, 17:11
  5. Delphi en SQL server
    By lommelen Erik in forum Algemeen
    Replies: 0
    Last Post: 09-Jul-01, 23:32

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •