Error Convert String to DateTime - sql-server

SELECT CONVERT(datetime,'17/05/2015 22:15:00',103)
output:
2015-05-17 22:15:00.000
I want include 2 column is Date+Time
Example: Colunm Date and Time
**Date** **Time**
17/05/2015 22:15:00
but Error Query
SELECT CONVERT(datetime,[Date]+' '+[Time],103) FROM LPTables
Conversion failed when converting date and/or time from character string.

Just add the time portion to the date portion:
SELECT DATEADD(ms, DATEDIFF(ms, '00:00:00', [Time]), CONVERT(DATETIME, [Date]))
FROM LPTables
This will give you accuracy to the millisecond.

Just enclose your columns with ().
SELECT CONVERT(datetime,([Date]+' '+[Time]),103) FROM LPTables
WHERE ISNULL([Date],'')!='' AND ISNULL([Time],'')!=''
Sample :

Related

Extracting date from varchar with timezone in snowflake

I have some sample data in snowflake as follows;
created_at
----------
2022-06-10T18::35::57
2022-06-10T18::35::57
The datatype of this column is VARCHAR(16777216), I am trying to filter for the rows with date June 10,2022. Here is my query;
select *
from table
where to_date(created_at) = date('2022-06-10', 'yyyy-mm-dd');
But this gives me following error; Date '2022-06-10T18::35::57' is not recognized. If we replace to_date by try_to_date then we get 0 rows. Unfortunately I can't go to backend and change the properties of the table. Therefore, I need to resort to sql datetime functions.
Can I please get help here, on how to fix above errors? thanx
Using LEFT to get date part:
where to_date(LEFT(created_at, 10), 'YYYY-MM-DD') = date('2022-06-10', 'YYYY-MM-DD');
There are two issues here -
1 - It is not a date but a timestamp
2 - usage of '::' rather then standard ':' in time portion
Below will not work as its not a date -
with date_cte(created_at) as
(select * from values
('2022-06-10T18::35::57'),
('2022-06-10T18::35::57'))
select to_date('2022-06-10T18::35::57') from date_cte;
100040 (22007): Date '2022-06-10T18::35::57' is not recognized
Using timestamp will not work too due to '::' in time portion
with date_cte(created_at) as
(select * from values
('2022-06-10T18::35::57'),
('2022-06-10T18::35::57'))
select to_timestamp('2022-06-10T18::35::57','yyyy-mm-dd"T"hh24:mi:ss') from date_cte;
100096 (22007): Can't parse '2022-06-10T18::35::57' as timestamp with format 'yyyy-mm-dd"T"hh24:mi:ss'
Below takes care of both -
with date_cte(created_at) as
(select * from values
('2022-06-10T18::35::57'),
('2022-06-10T18::35::57'))
select to_timestamp('2022-06-10T18::35::57','YYYY-MM-DD"T"HH24::MI::SS') from date_cte;
TO_TIMESTAMP('2022-06-10T18::35::57','YYYY-MM-DD"T"HH24::MI::SS')
2022-06-10 18:35:57.000
2022-06-10 18:35:57.000
Now to compare - just convert in desired format using to_char -
with date_cte(created_at) as
(select * from values
('2022-06-10T18::35::57'),
('2022-06-10T18::35::57'))
select * from date_cte
where to_char(to_timestamp('2022-06-10T18::35::57','YYYY-MM-DD"T"HH24::MI::SS'),'yyyy-mm-dd')='2022-06-10';
CREATED_AT
2022-06-10T18::35::57
2022-06-10T18::35::57
One possible way is to do this:
SELECT *
FROM table
WHERE CAST(SUBSTRING(created_at, 0, 11) as date) = '2022-06-10'

Query Ignoring Date with search

Good morning everyone,
Im having an issue that I have not seen before where the date parameter im using is totally ignored and the query is giving me ambigious results.
the code im using is
DECLARE #STARTDATE VARCHAR='03/07/2018'
Select
CONVERT(VARCHAR, CloseDateTime, 103 ) AS INSPECTION_DATE,
CallProperties.ID,
(CallProperties.UserRef) AS ENGINEER,
(CallProperties.CallRef) as ReferenceNo,
(CallProperties.CallTypeName) as JobType,
(SELECT2) AS VEN_POSTCODE,
(ADVANCED_oil.PARENTid) AS PARENTID,
ADVANCED_oil.Panel_CustDetails_C_EAddress,
(ADVANCED_oil.Adv_OilTestComplete) as OilTestTaken
from CallProperties left JOIN ADVANCED_oil ON (ADVANCED_oil.ParentID=CallProperties.ID) where Adv_OilTestComplete='Low oil'
OR Adv_OilTestComplete='Tube restriction'
OR Adv_OilTestComplete='No dip stick'
OR Adv_OilTestComplete='Vendor refused' AND CONVERT(VARCHAR, CloseDateTime, 103 )=#STARTDATE
its supposed to give me one result back but keeps giving me 7 rows, some of which do not have anything to do with the paramenter values....please help!!
Thankyou in advance
Your problem starts with the first line:
DECLARE #STARTDATE VARCHAR = '03/07/2018'
There are two major things wrong and one important but not major:
Dates should be DATES, not strings.
You have declared a string with one character.
You should always use proper ISO standard date formats
Change this to:
DECLARE #STARTDATE DATE = '2018-07-03';
Then do the comparison as a date:
CONVERT(DATE, CloseDateTime) = #STARTDATE
As far as I know, CONVERT() and CAST() to DATE are the only functions that still allow an index to be used.
EDIT:
Your where clause is also malformed. You probably intend:
where Adv_OilTestComplete IN ('Low oil', 'Tube restriction', 'No dip stick', 'Vendor refused') AND
CONVERT(DATE, CloseDateTime) = #STARTDATE
the main issue in you code in filter part
where Adv_OilTestComplete='Low oil'
OR Adv_OilTestComplete='Tube restriction'
OR Adv_OilTestComplete='No dip stick'
OR Adv_OilTestComplete='Vendor refused' AND CONVERT(DATE, CloseDateTime) = #STARTDATE
it has to be like this
where (Adv_OilTestComplete='Low oil'
OR Adv_OilTestComplete='Tube restriction'
OR Adv_OilTestComplete='No dip stick'
OR Adv_OilTestComplete='Vendor refused') AND CONVERT(DATE, CloseDateTime) = #STARTDATE
because And has higher priority than or you can check this reference

How to check date time column value equals to current date in sql where clause

I have a date time column in sql DB - named check_time. I want to write a select query where this check_time should be equals to today's date (no need to consider what time is. Only need to check current date).
For example check_time in table is inserted as 03/08/2017 12:00:00.000 AM.
I have written like below
SELECT * FROM time_details
WHERE check_time = DATEADD(day, DATEDIFF(day,0,GETDATE()),0)
But it returns nothing.
This is the correct syntax:
SELECT * FROM time_details where (DATEDIFF(d, check_time, GETDATE()) = 0)
Just CAST the today's date to DATE.
Query
select * from time_details
where check_time = cast(getdate() as date);
Try with
SELECT * FROM time_details where DATE(check_time) =CURDATE()
The DATE function is going to extract just the date from you datetime field while the CURDATE is returning the current date.
Check with the sql query
SELECT * FROM time_details where DATE(check_time)=DATE(NOW())
this should work
SELECT * FROM time_details where check_time =convert(varchar, getdate(), 101)

Conversion fails when converting date average to date in sql

I have calculated a date average from several dates and I'm trying to get the result of the average date, but I'm getting the following error:
Conversion failed when converting date and/or time from character string.
Here's the SQL query I tried:
select
CONVERT(DATE, LEFT(convert(varchar(10), AVG(convert(int, convert(varchar(10), OnMarkDate, 112)))), 8))
from
#tbl_XMLResult
Here are the date values in table #tbl_XMLResult:
'2001-10-11',
'2001-10-03',
'2001-09-24',
'2000-05-31',
'2001-10-15',
'2008-01-01'
These dates are of type date.
Are you looking for something like this?
I calculate the differences in days from the oldest date (2000-05-31) in the first CTE, then I calculate the average of those day differences (all int values), and then I add this average to the oldest date, to get an "average" date.
DECLARE #input TABLE (OnMarkDate DATE)
INSERT INTO #input (OnMarkDate)
VALUES ('2001-10-11'), ('2001-10-03'), ('2001-09-24'),
('2000-05-31'), ('2001-10-15'), ('2008-01-01');
DECLARE #OldestDate DATE = '2000-05-31';
;WITH DateAndDayDiff AS
(
SELECT DayDiff = DATEDIFF(DAY, #OldestDate, OnMarkDate)
FROM #INPUT
), AverageDayDiff AS
(
SELECT AverageDiff = AVG(DayDiff)
FROM DateAndDayDiff
)
SELECT
DATEADD(DAY, AverageDayDiff.AverageDiff, #OldestDate)
FROM AverageDayDiff
When I do this, I get 2002-07-30 as the "average" date for this list of dates.

How to query DATETIME field using only date in Microsoft SQL Server?

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')

Resources