Jag försöker plocka ur alla rader från en tabell där datumet och tiden nu är detsamma som Tabell1.Fält (date) + Tabell2.Fält (int). Det är egentligen en enkel sak att göra men problemet är att jag inte får fram något om jag kollar med =. Personligen tycker jag att det är en dum lösning att spara tiden som sekunder från ett visst datum. Vad har fältet (int) för betydelse för det första? Är det sekunder, minuter, timmar, dagar, månader eller år? Grundproblemet ligger i att jämföra ett datum med ett annat datum och i en annan tråd så skrev Andreas att det beror på datum sparas som decimaltal och att dom tydligen inte blir helt exakta då. Därför går det tex bra om man gör om datumet till en sträng och jämför, då blir det alltid lika. Jag har då aldrig haft problem med att jämföra datum. Hur jämför du egentligen? Jag jämför Tabell.Datumfält = #2007-04-24 13:45#, dvs enbart på minutnivå. Datumen som läggs in är också bara på minutnivå. Vet inte, men om du lägger in datum på minutnivå och är säker på att de är det så tycker jag inte jämförelsen borde vara något problem. Du kan ju förstås jämföra två datum med DATEDIFF funktionen på någon lämplig nivå, fast sekunder, och ta med de rader där resultatet blir 0. Om du skal jämföra på minut nivå skriver du så här: Datumen jag lägger in är på minutnivå så jag tycker också att det som sparas i databasen (oavsett hur det sparas) borde vara en exakt tid. Men tydligen inte. DateDiff() skulle kunna vara lösningen, jag återkommer med resultat. Datediff är dåligt ur prestanda synpunkt. Då du inte kan utnyttja index ochk måste göra minst ett funktionsanrop per post. Ok. Lösningar på problemet har jag haft redan tidigare, det var just prestandan som var dålig. I första inlägget gör du operationen på databas värdet. Inte på det konstanta värdet. Jag tänkte ta tag i mitt gamla problem och få det löst nu. Men hur lägger jag till Tabell2.Fält (int) till Tabell1.Fält (date) på bästa sätt? Den här koden använder jag nu och den tar för lång tid (klart längre tid än när jag körde med datumet som ett heltal med antalet sekunder): Eftersom du verkar använda Access kan du ju prova om Between funktionen gör någon skillnad. Nej, ingen direkt skillnad. Fler tips? Processorn går på typ 80% i 30 sek när jag kör koden så här. Tidigare när jag använda mig av Antal-sekunder-från-ett-visst-datum istället för ett datumfält så märkte man inte ens av när koden kördes. Jag testade att gå tillbaka till datumfält och att helt enkelt kolla med = och det fungerade bra. Trodde jag. Nu har jag fått höra från diverse användare att det inte fungerar så det går inte. Jag har ett förslag: Jag brukar föredra att inte ha klockslag lagrat i samma fält som datumet just för att det blir mycket krångligare att jämföra datum. Om du har datum och klockslag i två separata fält så kan du ju jämföra det som strängvärden istället för att behöva slå ihop och krångla.Jämföra datum
Jag måste antingen göra om både tiden nu och databas-datumet till strängar och jämföra dom eller så kollar jag tiden nu > databas-datum -1 sek och tiden nu < datbas-datum +1 sek.
Jag nämnde det här i en annan tråd (som jag inte hittar nu) och då fick jag till svar att det beror på att datumet i en databas sparas som flyttal och kanske inte är helt exakta.
Jag hade nöjt mig med dom 2 lösningar jag har kommit fram till, men dom tar väldigt mycket längre tid att utföra än om jag bara använder =.
Finns det någon bra lösning?
ThomasSv: Jämföra datum
Du borde med DATEADD funktionen, om den nu finns i Access (vilket jag tror), lägga till på datumfältet antalet enheter angivet i int fältet.Sv:Jämföra datum
Vill man fortfarande ha bra prestanda så går det perfekt att ha datumet som ett heltal med antalet sekunder från ett annat datum.
ThomasSv: Jämföra datum
Tror det som skulle kunna ställa till problem var om Access även lagrar millisekunder. Då kommer en = jämförelse att ge fel resultat (oftast).Sv:Jämföra datum
Hur ställer man in vilken noggranhet som Access ska spara datumen i?
ThomasSv: Jämföra datum
Då har du kvar möjligheten att utföra alla datumfunktioner på datumet om du behöver.Sv: Jämföra datum
Tabell.Datumfält >= #2007-04-24 13:45# AND Tabell.Datumfält < #2007-04-24 13:46#
Sv:Jämföra datum
ThomasSv: Jämföra datum
Sv:Jämföra datum
Ditt förslag med att jämföra med >= och < har jag inte provat, men som jag skrev i det första inlägget så har jag testat en liknande kod och också där var prestandan ett problem.
ThomasSv: Jämföra datum
Så i ditt första exempel kan du inte utnytja index.Sv:Jämföra datum
<code>
DateAdd('s', Tabell2.Intfält, Tabell1.Datumfält) >= #2007-04-24 13:45# AND DateAdd('s', Tabell2.Intfält, Tabell1.Datumfält) < #2007-04-24 13:46#
</code>
Det kommer väl att bli ganska segt?
/ThomasSv: Jämföra datum
<code>
...WHERE Tabell1.Fält < DATEADD('s', Tabell2.Fält +1, #" & System.DateTime.Now.ToString("g") & ":00#) AND Tabell1.Fält > DATEADD('s', Tabell2.Fält -1, #" & System.DateTime.Now.ToString("g") & ":00#)
</code>
Går det att förbättra?
/ThomasSv:Jämföra datum
...WHERE Tabell1.Fält Between dinStartid AND dinStopptidSv: Jämföra datum
/ThomasSv: Jämföra datum
Eftersom det fungerar bra att tex jämföra datumen som strängar så tänkte jag att man kunde hämta ut alla fält som är typ 5 min före och 5 min efter tiden nu, sen kollar man bara av dom som strängar. Det borde inte ta lika lång tid som att kolla av alla fält som strängar.
Är det möjligt att göra så?
/ThomasSv:Jämföra datum
* Låt datumkolumnen i Tabell1, kallat Fält i ditt exempel, vara datumtyp.
* Lägg till ett index på kolumnen
* Ändra intervallkolumnen i Tabell2, oxå kallat Fält i ditt exempel, till datumtyp
* Värden matas in som = S / 24 / 60 /60 = S / 86400 (Det går 86400 sekunder på ett dygn)
* SQL frågan utformar du så här:
WHERE Tabell1.Fält < (? + Tabell2.Fält) AND Tabell1.Fält > (? + Tabell2.Fält)
* När du exekverar frågan skickar du med två parametrar
* Den första är Now - 1s
* Den andra är Now + 1s
JAg tror problemet att frågan nu måste exekvera funkionsanropet för varje rad. Funktionsanrop på radnivå är långsamt i Access.
Sv: Jämföra datum