sql data not returning based on date - sql

i have a column in my database wich stores a date as date/time. I have a sql query to select all records where the date matches the one in the query. but it is not returning any data.
select Name,Dateadded from table
this returns results like
Bob Smith 2009-12-11 09:35:53.000
I changed my query to be the below and no results are returned.
select Name,Dateadded from table where dateadded = '2009-12-11'
I tried the converting to date and still no luck, I have to enter in a date between query to get it working
SELECT
Name, convert(varchar(10), Dateadded , 103)
FROM
table
can anyone tell me where I'm going wrong? I have tried using 'like' and still does not work if I do 'between' two date ranges it works

It may be like this:
WHERE Dateadded >= '2014-07-24' AND Dateadded < '2014-07-25'
WHERE Dateadded >= '2014-07-24' AND Dateadded < DATEADD(dd, 1, '2014-07-24')
or with convert:
WHERE convert(date,Dateadded) = '2014-07-24'
and also you can do something like that
WHERE DAY(Dateadded) = 24 AND MONTH(Dateadded) = 07 AND YEAR(Dateadded) = 2014

Convert datetime to date in your where clause:
select Name,Dateadded
from table
where Convert(date, dateadded) = '2009-12-11'

Casting to date as in other answers will work. For performance, it may be better (depending on indexes) to use:
select Name,Dateadded
from [table]
where dateadded >= '2009-12-11'
and dateadded < '2009-12-12'

Use = only when you expect exact match. In your case you can use :
select Name,Dateadded from table where dateadded like '2009-12-11%'

You can try
select Name,Dateadded from table where date(dateadded) = '2009-12-11'
as you are trying to match only date.
Note : after seeing comments , it seems you are using sql server 2012, above works in mysql not sure about sql server 2012

The following codes will work:
SELECT Name,Dateadded FROM table WHERE Dateadded LIKE '2009-12-11%'
or
SELECT Name,Dateadded FROM table WHERE Dateadded >= '2009-12-11 00:00:00' AND Dateadded <= '2009-12-11 23:59:59'
or
SELECT Name,Dateadded FROM table WHERE Dateadded BETWEEN '2009-12-11 00:00:00' AND '2009-12-11 23:59:59'

Related

Display a date that is the same as today in SQL Server [duplicate]

I have a table TEST with a DATETIME field, like this:
ID NAME DATE
1 TESTING 2014-03-19 20:05:20.000
What I need a query returning this row and every row with date 03/19/2014, no matter what the time is. I tried using
select * from test where date = '03/19/2014';
But it returns no rows. The only way to make it work that I found is to also provide the time portion of the date:
select * from test where date = '03/19/2014 20:03:02.000';
use range, or DateDiff function
select * from test
where date between '03/19/2014' and '03/19/2014 23:59:59'
or
select * from test
where datediff(day, date, '03/19/2014') = 0
Other options are:
If you have control over the database schema, and you don't need the
time data, take it out.
or, if you must keep it, add a computed column attribute that has the time portion of the date value stripped off...
Alter table Test
Add DateOnly As
DateAdd(day, datediff(day, 0, date), 0)
or, in more recent versions of SQL Server...
Alter table Test
Add DateOnly As
Cast(DateAdd(day, datediff(day, 0, date), 0) as Date)
then, you can write your query as simply:
select * from test
where DateOnly = '03/19/2014'
Simple answer;
select * from test where cast ([date] as date) = '03/19/2014';
I am using MySQL 5.6 and there is a DATE function to extract only the date part from date time. So the simple solution to the question is -
select * from test where DATE(date) = '2014-03-19';
http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html
This works for me for MS SQL server:
select * from test
where
year(date) = 2015
and month(date) = 10
and day(date)= 28 ;
select * from test
where date between '03/19/2014' and '03/19/2014 23:59:59'
This is a realy bad answer. For two reasons.
1.
What happens with times like 23.59.59.700 etc.
There are times larger than 23:59:59 and the next day.
2.
The behaviour depends on the datatype.
The query behaves differently for datetime/date/datetime2 types.
Testing with 23:59:59.999 makes it even worse because depending on the datetype you get different roundings.
select convert (varchar(40),convert(date , '2014-03-19 23:59:59.999'))
select convert (varchar(40),convert(datetime , '2014-03-19 23:59:59.999'))
select convert (varchar(40),convert(datetime2 , '2014-03-19 23:59:59.999'))
-- For date the value is 'chopped'.
-- For datetime the value is rounded up to the next date. (Nearest value).
-- For datetime2 the value is precise.
use this
select * from TableName where DateTimeField > date() and DateTimeField < date() + 1
Try this
select * from test where Convert(varchar, date,111)= '03/19/2014'
you can try this
select * from test where DATEADD(dd, 0, DATEDIFF(dd, 0, date)) = '03/19/2014';
There is a problem with dates and languages and the way to avoid it is asking for dates with this format YYYYMMDD.
This way below should be the fastest according to the link below. I checked in SQL Server 2012 and I agree with the link.
select * from test where date >= '20141903' AND date < DATEADD(DAY, 1, '20141903');
Bad habits to kick : mis-handling date / range queries
You can use this approach which truncates the time part:
select * from test
where convert(datetime,'03/19/2014',102) = DATEADD(dd, DATEDIFF(dd, 0, date), 0)
-- Reverse the date format
-- this false:
select * from test where date = '28/10/2015'
-- this true:
select * from test where date = '2015/10/28'
Simply use this in your WHERE clause.
The "SubmitDate" portion below is the column name, so insert your own.
This will return only the "Year" portion of the results, omitting the mins etc.
Where datepart(year, SubmitDate) = '2017'
select *, cast ([col1] as date) <name of the column> from test where date = 'mm/dd/yyyy'
"col1" is name of the column with date and time
<name of the column> here you can change name as desired
select *
from invoice
where TRUNC(created_date) <=TRUNC(to_date('04-MAR-18 15:00:00','dd-mon-yy hh24:mi:ss'));
Test this query.
SELECT *,DATE(chat_reg_date) AS is_date,TIME(chat_reg_time) AS is_time FROM chat WHERE chat_inbox_key='$chat_key'
ORDER BY is_date DESC, is_time DESC
select * from invoice where TRANS_DATE_D>= to_date ('20170831115959','YYYYMMDDHH24MISS')
and TRANS_DATE_D<= to_date ('20171031115959','YYYYMMDDHH24MISS');
SELECT * FROM test where DATEPART(year,[TIMESTAMP]) = '2018' and DATEPART(day,[TIMESTAMP]) = '16' and DATEPART(month,[TIMESTAMP]) = '11'
use trunc(column).
select * from test t where trunc(t.date) = TO_DATE('2018/06/08', 'YYYY/MM/DD')

SQL Query Date compare options

I'm trying to compare the current date with database datetime column. I tried the following three options, but no luck. Any idea?
Option 1
select something from tableA
where cast(lastupdateddate as date)=cast(GETDATE() as date)
Option 2
select something from tableA
where CONVERT(date, lastupdateddate)=CONVERT(date, GETDATE())
Option 3
select something from tableA
where CONVERT(VARCHAR(8), lastupdateddate,1)=CONVERT(VARCHAR(8), GETDATE(),1)
Right the first option should already work, provided the column has really datetime datatype, e.g.
create table tablea (
id int,
lastupdateddate datetime
);
and the query
select *
from tablea
where cast(lastupdateddate as date) = cast(getdate() as date)
See SQLFiddle

How to get DATE from DATETIME Column in SQL? [duplicate]

This question already has answers here:
How to return only the Date from a SQL Server DateTime datatype
(46 answers)
Closed 7 years ago.
I have 3 columns in Table TransactionMaster in sql server
1) transaction_amount
2) Card_No
3) transaction_date-- datetime datatype
So, I want to fetch SUM of transaction_amount where Card_No=' 123' and transaction_date= todays date.<----- excluding time IN SQL
Simply cast your timestamp AS DATE, like this:
SELECT CAST(tstamp AS DATE)
SQLFiddle Demo
In other words, your statement would look like this:
SELECT SUM(transaction_amount)
FROM mytable
WHERE Card_No='123'
AND CAST(transaction_date AS DATE) = target_date
What is nice about CAST is that it works exactly the same on most SQL engines (SQL Server, PostgreSQL, MySQL), and is much easier to remember how to use it.
Methods using CONVERT() or TO_DATE() are specific to each SQL engine and make your code non-portable.
You can use
select *
from transaction
where (Card_No='123') and (transaction_date = convert(varchar(10),getdate(),101))
Use Getdate()
select sum(transaction_amount) from TransactionMaster
where Card_No=' 123' and transaction_date =convert(varchar(10), getdate(), 102)
use the following
select sum(transaction_amount) from TransactionMaste
where Card_No = '123' and transaction_date = CONVERT(VARCHAR(10),GETDATE(),111)
or the following
select sum(transaction_amount) from TransactionMaste
where Card_No = '123' and transaction_date = CONVERT(VARCHAR(10), GETDATE(), 120)
Try this:
SELECT SUM(transaction_amount) FROM TransactionMaster WHERE Card_No ='123' AND CONVERT(VARCHAR(10),GETDATE(),111)
The GETDATE() function returns the current date and time from the SQL Server.

Query datetime in SQL without time

I'm trying to write a SQL query which should just pick the count with specific date not time.
select count(*) from xyz where time='2010-01-21'
but it is not returning any results.
For SQL Server 2008, you should be able to use the date data type:
select count(*) from xyz where cast(time as date) = '2010-01-21'
If you have a date time field, and you wanted to match a date:
select count(*) from xyz where time BETWEEN '2010-01-21' AND '2010-01-22'
MYSQL Date Time ref
Try (MySQL)
SELECT COUNT(*) FROM xyz WHERE DATE(datetime_col) = '2010-01-21'
in T-SQL (MSSQL) (kinda ugly, but should work):
SELECT * FROM xyz WHERE CAST(CONVERT(varchar(8), datetime_col, 112) AS DATETIME) <= '2011-01-21'

SQL ORDER BY date problem

Can you please help me in solving this problem. I am trying to order the results of an SQL query by date, but I'm not getting the results I need.
The query I'm using is:
SELECT date FROM tbemp ORDER BY date ASC
Results are:
01/02/2009
03/01/2009
04/06/2009
05/03/2009
06/12/2008
07/02/2009
Results should be:
06/12/2008
03/01/2009
01/02/2009
07/02/2009
I need to select the date in the format above.
Your help is much appreciated.
It seems that your date column is not of type datetime but varchar. You have to convert it to datetime when sorting:
select date
from tbemp
order by convert(datetime, date, 103) ASC
style 103 = dd/MM/yyyy (msdn)
It sounds to me like your column isn't a date column but a text column (varchar/nvarchar etc). You should store it in the database as a date, not a string.
If you have to store it as a string for some reason, store it in a sortable format e.g. yyyy/MM/dd.
As najmeddine shows, you could convert the column on every access, but I would try very hard not to do that. It will make the database do a lot more work - it won't be able to keep appropriate indexes etc. Whenever possible, store the data in a type appropriate to the data itself.
Unsure what dbms you're using however I'd do it this way in Microsoft SQL:
select [date]
from tbemp
order by cast([date] as datetime) asc
this works for me:
SELECT datefield
FROM myTable
ORDER BY CONVERT(DATE, datefield) ASC
Following answer may help you
perform your date ordering by your date identifier but use to_char() function in select clause and use some other identifier in select clause for date
e.g.
SELECT TO_CHAR(DISPDATE1,'DD/MM/YYYY') AS DISPDATE,
SUM(APPLCOUNT) AS APPLIED,
SUM(CONFCOUNT) AS CONFIRMED
FROM
(
SELECT COUNT(ID) AS APPLCOUNT,
0 AS CONFCOUNT,
STUDENT.APPLIED_ON AS DISPDATE1
FROM STUDENT
WHERE STUDENT.ID = P_ID
GROUP BY STUDENT.APPLIED_ON
UNION
SELECT 0 AS APPLCOUNT,
COUNT(ID) AS CONFCOUNT,
STUDENT.CONFIRMED_ON AS DISPDATE1
FROM STUDENT
WHERE STUDENT.ID = P_ID
GROUP BY STUDENT.CONFIRMED_ON
)
GROUP BY DISPDATE1
ORDER BY DISPDATE1;
SELECT CONVERT(char(19), CAST(date AS datetime), 101) as [date]
FROM tbemp
ORDER BY convert(datetime, date, 101) ASC
Try using this this work for me
select * from `table_name` ORDER BY STR_TO_DATE(start_date,"%d-%m-%Y") ASC
where start_date is the field name
I wanted to edit several events in descendant chonologic order, and I just made a :
select
TO_CHAR(startdate,'YYYYMMDD') dateorder,
TO_CHAR(startdate,'DD/MM/YYYY') startdate,
...
from ...
...
order by dateorder desc
and it works for me.
But surely not adapted for every case...
Just hope it'll help someone !
This may help you in mysql, php.
//your date in any format
$date = $this->input->post('txtCouponExpiry');
$day = (int)substr($date, 3, 2);
$month = (int)substr($date, 0, 2);
$year = (int)substr($date, 7, 4);
$unixTimestamp = mktime(0, 0, 0, $year, $day, $month);
// insert it into database
'date'->$unixTimestamp;
//query for selecting order by date ASC or DESC
select * from table order_by date asc;
try this
Order by Convert(datetime,#date) desc
this should work for your date format
order by convert(date, your_column, 104) desc
Casting/Converting can result in out of range exceptions that unfortunately are not always as simple as excluding nulls.
A simple alternative method, which avoids the cast, is:
SELECT date
FROM table
ORDER BY YEAR(date), MONTH(date), DAY(date) ASC;