Solved

SQL DateTime Comparison

Posted on 2000-04-06
11
214 Views
Last Modified: 2010-04-04
I want to select records with a time stamp of (now - n*hours).  I'm using D3 and Paradox tables. Here's what I've done that doesn't work:

q is tquery
lastplay is tdatetime
n is integer

 q.Close;
 q.SQL.Clear;
 q.SQL.Add('select * from tracks where lastplay < :param');

 q.ParamByName('param').AsDateTime := now - n/24;
 q.Open;

what am i missing? it must be something simple.
0
Comment
Question by:rwv
  • 4
  • 3
  • 2
  • +2
11 Comments
 
LVL 27

Expert Comment

by:kretzschmar
ID: 2692301
? rwv,

where is the problem?
have done just a test and it works properly

sample code

//query holds : select * from time_db where dt < :param
procedure TForm1.Button1Click(Sender: TObject);
begin
  query1.Close;
  query1.ParamByName('param').AsDateTime := now - (strtoint(edit1.text)/24);
  query1.Open;
end;

do you get an errormessage?

meikl
0
 
LVL 6

Expert Comment

by:wimmeyvaert
ID: 2692311
Hi rwv,

What error do you get ?

Regards,
The Mayor
0
 
LVL 2

Expert Comment

by:Felixin
ID: 2692370
Hi, RWY and all of you


Are you sure that the conversion to hours of N/24 is OK?

Why don't you use

function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;

calling it like this

EncodeTime (MyNumberOFHours, 0, 0, 0);

The problem is that I don't understand what you mean by "It doesn't work". Do you have any kind of error message or, simply, you don't get the result that you where expecting?

Best regards
0
The Eight Noble Truths of Backup and Recovery

How can IT departments tackle the challenges of a Big Data world? This white paper provides a roadmap to success and helps companies ensure that all their data is safe and secure, no matter if it resides on-premise with physical or virtual machines or in the cloud.

 
LVL 27

Expert Comment

by:kretzschmar
ID: 2692375
felixin
n/24 is ok
meikl
0
 
LVL 9

Expert Comment

by:ITugay
ID: 2692436
listening...
0
 

Author Comment

by:rwv
ID: 2692470
no error, i'm just not getting the result i expect.
my sql statement is a little more complex.  i'll look it over more closely and let you know.
0
 
LVL 9

Expert Comment

by:ITugay
ID: 2692495
rwv,
can you show us your SQL and table structures? It will easy to help you.
-----
Igor.
0
 

Author Comment

by:rwv
ID: 2692593
I've simplified my query and it still isnt working right.  

I'm using the var tn just to look at the values at a break point, they seem to be ok.

I've discovered something curious:
When set the value of the table's field (lastplay) to now() with an update query, the select query fails to exclude this record.
However, when I edit this record in a dbgrid, by only retyping a character of the date string, and then post it, the query works as expected.

Any ideas?

The only field below that really matters is lastplay which is a tDateTime.

function TfrmJBox.TrackQuery(cdid : integer) : boolean;
var ok : boolean;
    qwhere : string;
    tn : tdatetime;
begin
  ok := true;

    qwhere := 'where (cdid ='+inttostr(cdid)+') and ((lastplay < :dtlastplay) or (lastplay is null)) ';

  try
    if qTracks.State <> dsInactive then
      qTracks.Close;
    qTracks.SQL.Clear;
    qTracks.SQL.Add('select '+
                   'trackno, tracklen, title, votes, points, plays, lastplay, id, artist '+
                   'from "'+gDataDir+'\tracks.db" '+
                   qwhere+
                   'order by trackno');
    tn := now;
    qTracks.ParamByName('dtlastplay').AsDateTime := tn - gMinReplayTime/24;
    qTracks.Open;
  except
    ok := false;
  end;
  TrackQuery := ok;
end;
0
 
LVL 9

Accepted Solution

by:
ITugay earned 200 total points
ID: 2692625
Still thinking...
but one crazy idea, is it possible you have different datetime format while making update by update query(dd/mm/yy and mm/dd/yy)?
----
Igor.
0
 

Author Comment

by:rwv
ID: 2693683
Igor,
I didnt change datetime format, but you did lead me to the solution:
I was using
  ' set lastplay = "'+DateTimeToStr(now)+'"'
changed it to
  ' set lastplay = :paramNow'
then AddParamByName('paramNow').AsDateTime

However, I dont understand why this makes a difference.  Aren't Tdatetime types just numbers once they are stored?

Thanks all for your help to everyone.

Bobby Valentine
0
 

Author Comment

by:rwv
ID: 2693691
correction
' set lastplay = :paramNow'
ParamByName('paramNow').AsDateTime := now;


 
0

Featured Post

DevOps Toolchain Recommendations

Read this Gartner Research Note and discover how your IT organization can automate and optimize DevOps processes using a toolchain architecture.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
build html 5 client that connect to indy Tidtcpserver 3 397
How to fill array with TArray.Create? 14 90
Delphi TcxGrid group footer summary 3 270
Dynamically Created Query 3 55
Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
This video shows how to use Hyena, from SystemTools Software, to bulk import 100 user accounts from an external text file. View in 1080p for best video quality.
Email security requires an ever evolving service that stays up to date with counter-evolving threats. The Email Laundry perform Research and Development to ensure their email security service evolves faster than cyber criminals. We apply our Threat…

773 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question