I need to retrieve rows from SQL database where a time-difference condition apply.
Basically I need to retrieve rows where date difference from Now() is < x minutes.
Column datetime has this format: 2022-12-05 15:01:43
I tried
SELECT * FROM copytrade WHERE DATEDIFF(minute, datetime, GETDATE() AS DateDiff) < 10
Using this select I get error "Incorrect parameter count in the call to native function 'DATEDIFF'
Is it possible in a single SQL line to achieve this select?
Thanks
Related
I am trying to run a query from a linked table in MS SQL Server that has a datetime field. I'm trying to run a simple query to search for records for a specific date (#03/24/2018#), but since the datetime field has the time as well, I am not getting any records unless I specify the time range using BETWEEN with the time (Between #03/24/2018 00:00:00 AM# And #03/24/2018 11:59:59 PM#).
Original query which does not return desired output:
SELECT *
WHERE MyDateTimeField) = #3/24/2018#;
Query
SELECT *
WHERE MyDateTimeField) Between #3/24/2018 00:00:00 AM# And #3/24/2018 23:59:59#);
Is there a workaround to this as to not have to use a BETWEEN operator with the time?
To avoid time portion, check forMyDateTimeFieldequal/greater than searched day and less than next day:
SELECT *
FROM MyTable
WHERE
MyDateTimeField >= #3/24/2018#
AND
MyDateTimeField < DateAdd("d",1,#3/24/2018#);
In opposite of convertingMyDateTimeFieldto date, this does not prevent index usage and handlesNullValues onMyDateTimeField.
I have a table which has the following columns -
Id end_time status
12 1407477033 success
13 1407479820 error
14 1407479974 error
I have to find all the id's which have status 'error' and were completed in the last 15 minutes. I am using ruby to interact with the database, so my query becomes ( the table name is q_lists ). To find the time difference I am using DATEDIFF -
date = QList.find_by_sql("select end_time from q_lists where id = #{a.id}")
diff = QList.find_by_sql("select DATEDIFF(minute, FROM_UNIXTIME(date), CURRENT_TIMESTAMP")
Note : a is the loop variable,I am iterating for each row.
I am getting the following error -
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'DATEDIFF'
How can I resolve this. Also can I write the query in a way all the id's are stored in an array using just one sql statement (without loop iterations).
EDIT
TIMESTAMPDIFF solves the problem. Sorry for squishing two questions in one, but can someone point the correct way of getting all id's in just one go without using loops.
MySQL's DATEDIFF is not the same as Microsoft's. It does not include the first parameter, and will only return the number of days between two dates. You want TIMESTAMPDIFF
I would like to query a mySQL table to pull out data between two dates and two times. I know how to do this for a single "datetime" column using the "between" call but my columns are one "date" column, and one "time" column. All the solution I can find online are for single datetime columns.
My ranges go from "day1" at 15:30 to day1+1day at 15:14
So far I can get the following range (which works):
SELECT time,
close
FROM intraday_values
WHERE date="2005-03-01"
and time between "15:30" and "23:59"
But I obviously need to incorporate 2 dates and two times. I have tried the following but get an error:
SELECT time,
close
FROM intraday_values
between date="2005-03-01"
and time="15:30"
and date="2005-03-02"
and time = "15:14"
Could someone help me formulate the query correctly? Many thanks
Not sure if your date field is indexed. If they are then the "concat" examples others have given may not perform very well.
As an alternative you can use a query of the form:
select *
from foo
where (date > lower_date and date < upper_date) -- technically this clause isn't needed if they are a day apart
or (date = lower_date and time >= lower_time)
or (date = upper_date and time <= upper_time)
It's not pretty but it works and will allow mysql to make use of indexes on the date field if they exist.
So your query would be
SELECT time,
close
FROM intraday_values
where (date > "2005-03-01" and date < "2005-03-02")
or (date = "2005-03-01" and time >= "15:30")
or (date = "2005-03-02" and time <= "15:14")
Use concat to combine these two column and cast it to datetime for the best results
SELECT
time,close
FROM
intraday_values
where
cast(concat(date," ",time) as datetime)
between
cast("2005-03-01 15:30") as datetime
and cast("2005-03-02 15:14") as datetime
I have a field of FromDate and a field of ToDate.
I am looking for the rows that today is between the "from" and "to"
select * from job
where job.type='manager'
and '2014-01-22' between job.FromDate and job.ToDate
The query does not throw an exception , and it even returns some rows. But it isn't right- the rows it returns do not have the dates I am looking for.
P.S. the date format I am using is the correct one for my DB.
Try this
select * from job
where job.type='manager'
and job.FromDate <= '2014-01-22' and job.ToDate >= '2014-01-22'
Comparing dates is often tricky, especially if the values are stored as datetime and not date. The time components can affect the comparison. Another possibility is that ToDate is NULL for the most recent records. Here is one way to fix this:
select *
from job
where job.type ='manager' and
date('2014-01-22') between date(job.FromDate) and date(coalesce(job.ToDate, '2099-12-31'))
However, the use of the function on the columns can make the query less efficient. Instead, you might try:
select *
from job
where job.type ='manager' and
job.FromDate < '2014-01-23' and
(job.ToDate >= '2014-01-22' or job.ToDate is null);
I have a table called "actions" with a DATETIME column called "occurred". I'm trying to return the records for today by doing the following
SELECT * FROM `actions` WHERE `occurred` = DATE(NOW());
But I get an empty result set. If I take the WHERE clause out, I can see all 295 rows in the table and there's at least 30 rows from today. Later I will be writing another query to return all records between today's date and X amount of days in the past but before I can get there I need to know why this query is returning an empty result set.
Thanks in advance.
SELECT * FROM actions WHERE DATE(ocurred) = CURDATE();
DATE(ocurred) ignores the time part.
Here's the SQL Fiddle to play with the data: http://www.sqlfiddle.com/#!2/81708/2
If there in no future date in occurred, you could just use below:
SELECT * FROM `actions` WHERE `occurred` > DATE_SUB(CURDATE(), INTERVAL 1 DAY);