I'm getting some strange results from using BETWEEN in my sql query. Wondering if anyone can help me to understand why i am getting these results.
I'm searching a date range in the format of dd/mm/yyyy. So i want to select all entries within a certain date range.
$dbSearchRecords_result = "SELECT * FROM $tbl_name WHERE Date BETWEEN '$DateFrom_order' AND '$DateTo_order'";
$dbSearchRecords_result = mysql_query($dbSearchRecords_result);
I am then calling the results in a while statement from an array
while ($row = mysql_fetch_array($dbSearchRecords_result)){
Now if I search BETWEEN 12/02/2011 14/02/2011 there is a date returned from 13/12/2010.
Yet if I search 12/02/2011 13/02/201 I do not get the result of 13/12/2010.
Any ideas would be most appreciated.
Thanks.
The BETWEENoperator is most likely reading your ranges as strings. From the book:
For best results when using BETWEEN
with date or time values, use CAST()
to explicitly convert the values to
the desired data type. Examples: If
you compare a DATETIME to two DATE
values, convert the DATE values to
DATETIME values. If you use a string
constant such as '2001-1-1' in a
comparison to a DATE, cast the string
to a DATE.
So, try:
SELECT * FROM `mytable`
WHERE `date` BETWEEN CAST('2011-01-02' AS DATE) AND CAST('2011-12-02' AS DATE)
MySQL's needs values in this format to do a proper comparison:
YYYY-MM-DD
you could use STR_TO_DATE to convert your string into the right format.
Plus obviously, the Date field needs to be of the DATE or DATETIME type.
try to format the values as DATE.. as in
$dbSearchRecords_result = "SELECT * FROM $tbl_name WHERE Date BETWEEN DATE('$DateFrom_order') AND DATE('$DateTo_order')";
Related
I'm trying to order my results by date, but the dates are strings, not date objects, so the results aren't showing up properly. I tried converting the date string to a date object in the sql request, but now nothing returns. There are no results showing on the screen. Here's my code:
SELECT * FROM tblnewsftb
WHERE Status = 'Active'
ORDER BY CONVERT(datetime, ItemDate, 102) DESC
What am I doing wrong?
In MySQL, CONVERT() only takes two arguments, the expression and a data type. The data type goes second.
Example:
CONVERT(ItemDate, DATETIME)
But this will work only if the expression (your ItemDate column in this example) is convertible as-is to a DATETIME. I would guess you're using some date format that MySQL doesn't support, like 'MM/DD/YYYY' or something else.
You'll have to use STR_TO_DATE() if you have a custom format.
Example:
STR_TO_DATE(ItemDate, '%m/%d/%Y')
It would really be best if you store datetime values in a proper DATETIME column instead of a string column if you want them to sort correctly.
I'm querying
SELECT * FROM tempLog WHERE date BETWEEN '23-03-2017' AND '02-04-2017'
and the result is null. How to fix this. But
SELECT * FROM tempLog WHERE date BETWEEN '23-03-2017' AND '30-03-2017'
giving me the correct result.
Note:- tempLog is the table name.
You should store dates in date format or atleast correctly formatted string (YYYY-MM-DD).
For now you can use str_to_date to convert the string to date and compare:
select *
from tempLog
where str_to_date(date, '%d-%m-%Y') between '2017-03-23' and '2017-04-02';
However note that this will hinder the optimizer from using index on the column if any.
The correct remedy of the situation is fixing the table structure.
According to the documentation, you're supposed to use this format when writing a date: 'YYYY-MM-DD' (although it says it may accept 'YYYYMMDD' or even YYYYMMDD in some contexts).
I have a table with a few columns. One of the column is named flight_date is varchar format.
It has a date stored in it in format like '08/12/2015' which is mm/dd/yyyy
I want to run a query which will return me a list of the records with date in 2016.
Can someone help me out please.
Thanks.
In this case, you can use SUBSTR function for just cut last 4 character.
SELECT * FROM yourtable where SUBSTR(flight_date, -4) = '2016'
Though, it is recommended to store date value in appropriate type column and not in varchar.
When I am trying to convert varchar to date, I get Null values in return.
I have values as 05-MAR-2015 in my column.
I am running following query.
select STR_TO_DATE('n.Invoice_date','%d-%c-Y') from table n;
Once I run above query I get null values in return.
I want to introduce a new column in date format.
Note that the literal string 'n.invoice_date' is not a valid date. What you mean is:
SELECT STR_TO_DATE(n.invoice_date, '%d-%b-%Y') FROM TABLE n
Your error is in usage of %c instead of %b to get the date. You mixed the formatting of the date with the creation of a date value. This should do it:
SELECT DATE_FORMAT(STR_TO_DATE(n.invoice_date,'%d-%b-%Y'), '%d-%c-%Y') FROM table n;
This results in: 05-3-2015
Here you first create a date with STR_TO_DATE which must match the format in which it is stored in the field. Then you can format it with DATE_FORMAT in the way you want to.
See the MYSQL Docs for more information: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format
I'm trying to query a MySQL database and return all records within a given date range and which also contain the substring 'bank' in the content column.
The format of the 'time' field I refer to is mm/dd/yyyy hh:mm:ss.
Here's the statement I've come up with but MySQL Workbench is giving me issues:
SELECT *
FROM blogs
WHERE ((‘time’ BETWEEN “04/01/2011 00:00:00” AND “04/15/2011 23:59:59”)
AND (‘content’ LIKE ‘%bank%’))
How about trying this:
SELECT *
FROM blogs
WHERE `time` BETWEEN '2011-04-01 00:00:00' AND '2011-04-15 23:59:59'
AND `content` LIKE '%bank%';
This works if your time field is in fact a timestamp. If time is not a timestamp then you will have to go with something like the answer from McAdam331 but I'm hoping your database is using the correct types for the kind of data you are asking it to store.
single ' or double " quotes around values and ticks ` around field names. I also changed the date format to yyyy-mm-dd hh:mm:ss and eliminated some unnecessary parentheses.
http://sqlfiddle.com/#!9/730bd/1/0
It would be helpful if you posted the structure of the table when posting questions like this so we can be sure to give the right answer.
It isn't a good idea to store dates like that in MySQL. The DBMS has Date and Time Types you can use to store that information.
If changing the database isn't an option, you can convert a string to a date object using the STR_TO_DATE function, which takes in a date string and the format that it is in already and returns a date.
MySQL stores dates in the 'YYYY-MM-DD' format, so to get that format you can try something like this:
SELECT STR_TO_DATE('04/01/2011', '%m/%d/%Y');
Which will return a date object for that day. Note the capital Y.
Then it becomes much easier to query between dates, like this:
SELECT *
FROM myTable
WHERE STR_TO_DATE(dateString, '%m/%d/%Y %H:%i:%s') BETWEEN STR_TO_DATE('04/01/2011 00:00:00', '%m/%d/%Y %H:%i:%s') AND STR_TO_DATE('04/15/2011 23:59:59', '%m/%d/%Y %H:%i:%s')
AND content LIKE '%bank%';
Here is an SQL Fiddle example, and here is a link that has the formatting characters you need.