Convert to Datefrom dd/mm/yyyy string SQL - sql

I currently have a string in the format dd/mm/yyyy which I'm trying to convert to a datetime variable in SQL.
I'm currently using this SQL statement:
CONVERT(datetime, ProposedTransferDate.AttributeValue, 101)
but I get an error:
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
Thanks
Chris

You should be using mask 103:
CONVERT(datetime,ProposedTransferDate.AttributeValue, 103)
From this TechOnTheNet article we find that mask 103 has the following format:
dd/mm/yy (British/French standard)

Use string manipulation to get it into a yyyy-mm-dd format:
CAST(
RIGHT(ProposedTransferDate.AttributeValue,4) +
'-' +
RIGHT(LEFT(ProposedTransferDate.AttributeValue,5),2) +
'-' +
LEFT(ProposedTransferDate.AttributeValue,2)
AS DATETIME)

That conversion error is due to your date column is not standard and unique SQL/ISO date formatwhich is YYYY-MM-DD. your date format may be in MM/DD/YYYY so if your login default Language UK means Date format will be like DD/MM/YYYY.So before convert you want change the default language in SQL SERVER .This link to show types of languages and learn about SET LANGUAGE(TSQL)
EG
SET LANGUAGE 'british english'
select convert(date,GETDATE(),103) ------------use date then it show only date
you can use another way also
SET LANGUAGE 'british english'
select DATEPART(dd,'2-3-2012')+ '/' + DATEPART(mm,'2-3-2012')+ '/' + DATEPART(yy,'2-3-2012')
or
SET LANGUAGE 'british english'
select CONCAT(DATEPART(dd,'2-3-2012'), '/' , DATEPART(mm,'2-3-2012'), '/' ,DATEPART(yy,'2-3-2012'))

Try this:
SELECT convert(datetime, '23/10/2016', 103)
Result:
2016-10-23 00:00:00.000

Related

Convert data and time into a numeric number in sql server

I have a data & time format column which I would like to convert to the following format in Microsoft SQL Server: yyyymmddhhmmss00000
So for example if I have 2021-02-04 11:49:50 this will be converted to 2021020411495000000.
Any one knows how to do it please?
You can use the FORMAT function:
SELECT FORMAT(myDate, 'yyyyMMddHHmmss00000')
By converting the date to NVARCHAR once with format 112 and once with format 8 you can extract the numeric date and the time without milliseconds. After removing : from the time you can concat these two strings and convert them to bigint. Following an example:
DECLARE #d DATETIME = GETDATE()
SELECT CAST(CONVERT(NVARCHAR(8), #d, 112) + REPLACE(CONVERT(NVARCHAR(8), #d, 8), ':', '') + '00000' AS BIGINT)

Converting date to YYYYMMDD format in SQL Server 2016 from T format

I have a date column in a SQL table where the values are stored in the below format.
2020-04-07T02:41:49
I need to get the date in YYYYMMDD format, like this: 20200407.
I tried using the below statements but it throws an error on conversion.
SELECT
CONVERT(DATETIME, SUBSTRING(CAST('2020-04-07T02:41:49' AS varchar), 1, 8))
SELECT
LEFT(4, CAST('2020-04-05T08:05:47' AS nvarchar))
Error:
Conversion failed when converting date and/or time from character string
Could someone please help?
Thanks.
You can use try_convert(date,...)
Example
Select WithFormat = format(try_convert(date,'2020-04-07T02:41:49'),'yyyyMMdd')
,OrNot = convert(varchar(10),try_convert(date,'2020-04-07T02:41:49'),112)
,OrString = replace(left('2020-04-07T02:41:49',10),'-','')
Returns
WithFormat OrNot OrString
20200407 20200407 20200407

Using Substring and Convert Datetime Sql Server 2017

This is my query:
declare #date char(10)
set #date = '11.08.1982'
select substring(#date,1,2)+ '/'+
SUBSTRING(#date,3,1)+ '/'+ SUBSTRING(#date,4,4) as resultat
I want to use CONVERT function to convert the result to datetime. How can I do this?
You can't convert this to date and time, however you can use replace function :
select replace(#data, '.', '/')
SQL Server is pretty good about picking up the format of a date with no conversion format. So, this works on db<>fiddle, assuming you intend MM.DD.YYYY for the format:
select convert(date, '11.08.1982')
If you want DD.MM.YYYY, then you can explicitly use the "104" format:
select convert(date, '11.08.1982', 104)
You don't have a time component, so I converted these to date. The same works for datetime.

Issue with conversion of a varchar data type to a datetime data type

I can't figure out why I'm getting:
'The conversion of a varchar data type to a datetime data type
resulted in an out-of-range value'
error when these three dates '011318'; '011418'; '011518' are being converted into datetime using CONVERT(datetime, [Date]) as[Date], but there is no problem with '011018'; '011118'; and '011218'.
Any help would be appreciated!
Use a style code, and inject some hyphens into the value to create the MM-dd-yy format:
CONVERT(date,STUFF(STUFF(YourColumn,5,0,'-'),3,0,'-'),10)
I think this does what you want:
select convert(date, '20' + right(date, 2) + left(date, 2) + substring(date, 3, 2))
This changes your string from MMDDYY to YYYYMMDD, which SQL Server readily converts to a date.
You get the error because if you convert the date '011318'; '011418'; '011518' they would be interpreted as 18.12.2001; 18.14.2001 and 18.15.2001. Default ist yymmdd and therefore it is out of range, becasue one year = 12 months

Convert varchar into datetime in SQL Server

How do I convert a string of format mmddyyyy into datetime in SQL Server 2008?
My target column is in DateTime
I have tried with Convert and most of the Date style values however I get an error message:
'The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.'
OP wants mmddyy and a plain convert will not work for that:
select convert(datetime,'12312009')
Msg 242, Level 16, State 3, Line 1
The conversion of a char data type to a datetime data type resulted in
an out-of-range datetime value
so try this:
DECLARE #Date char(8)
set #Date='12312009'
SELECT CONVERT(datetime,RIGHT(#Date,4)+LEFT(#Date,2)+SUBSTRING(#Date,3,2))
OUTPUT:
-----------------------
2009-12-31 00:00:00.000
(1 row(s) affected)
SQL Server can implicitly cast strings in the form of 'YYYYMMDD' to a datetime - all other strings must be explicitly cast. here are two quick code blocks which will do the conversion from the form you are talking about:
version 1 uses unit variables:
BEGIN
DECLARE #input VARCHAR(8), #mon CHAR(2),
#day char(2), #year char(4), #output DATETIME
SET #input = '10022009' --today's date
SELECT #mon = LEFT(#input, 2), #day = SUBSTRING(#input, 3,2), #year = RIGHT(#input,4)
SELECT #output = #year+#mon+#day
SELECT #output
END
version 2 does not use unit variables:
BEGIN
DECLARE #input CHAR(8), #output DATETIME
SET #input = '10022009' --today's date
SELECT #output = RIGHT(#input,4) + SUBSTRING(#input, 3,2) + LEFT(#input, 2)
SELECT #output
END
Both cases rely on sql server's ability to do that implicit conversion.
Likely you have bad data that cannot convert. Dates should never be stored in varchar becasue it will allow dates such as ASAP or 02/30/2009. Use the isdate() function on your data to find the records which can't convert.
OK I tested with known good data and still got the message. You need to convert to a different format becasue it does not know if 12302009 is mmddyyyy or ddmmyyyy. The format of yyyymmdd is not ambiguous and SQL Server will convert it correctly
I got this to work:
cast( right(#date,4) + left(#date,4) as datetime)
You will still get an error message though if you have any that are in a non-standard format like '112009' or some text value or a true out of range date.
I found this helpful for my conversion, without string manipulation. https://learn.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql
CONVERT(VARCHAR(23), #lastUploadEndDate, 121)
yyyy-mm-dd hh:mi:ss.mmm(24h) was the format I needed.
Convert would be the normal answer, but the format is not a recognised format for the converter, mm/dd/yyyy could be converted using convert(datetime,yourdatestring,101) but you do not have that format so it fails.
The problem is the format being non-standard, you will have to manipulate it to a standard the convert can understand from those available.
Hacked together, if you can guarentee the format
declare #date char(8)
set #date = '12312009'
select convert(datetime, substring(#date,5,4) + substring(#date,1,2) + substring(#date,3,2),112)
Look at CAST / CONVERT in BOL that should be a start.
If your target column is datetime you don't need to convert it, SQL will do it for you.
Otherwise
CONVERT(datetime, '20090101')
Should do it.
This is a link that should help as well:
I'd use STUFF to insert dividing chars and then use CONVERT with the appropriate style. Something like this:
DECLARE #dt VARCHAR(100)='111290';
SELECT CONVERT(DATETIME,STUFF(STUFF(#dt,3,0,'/'),6,0,'/'),3)
First you use two times STUFF to get 11/12/90 instead of 111290, than you use the 3 to convert this to datetime (or any other fitting format: use . for german, - for british...) More details on CAST and CONVERT
Best was, to store date and time values properly.
This should be either "universal unseparated format" yyyyMMdd
or (especially within XML) it should be ISO8601: yyyy-MM-dd or yyyy-MM-ddThh:mm:ss More details on ISO8601
Any culture specific format will lead into troubles sooner or later...
use Try_Convert:Returns a value cast to the specified data type if the cast succeeds; otherwise, returns null.
DECLARE #DateString VARCHAR(10) ='20160805'
SELECT TRY_CONVERT(DATETIME,#DateString)
SET #DateString ='Invalid Date'
SELECT TRY_CONVERT(DATETIME,#DateString)
Link:MSDN TRY_CONVERT (Transact-SQL)
I had luck with something similar:
Convert(DATETIME, CONVERT(VARCHAR(2), #Month) + '/' + CONVERT(VARCHAR(2), #Day)
+ '/' + CONVERT(VARCHAR(4), #Year))
The root cause of this issue can be in the regional settings - DB waiting for YYYY-MM-DD while an app sents, for example, DD-MM-YYYY (Russian locale format) as it was in my case. All I did - change locale format from Russian to English (United States) and voilà.
This seems the easiest way..
SELECT REPLACE(CONVERT(CHAR(10), GETDATE(), 110),'-','')
SQL standard dates while inserting or updating Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
So if you are inserting/Updating below 1/1/1753 you will get this error.
DECLARE #d char(8)
SET #d = '06082020' /* MMDDYYYY means June 8. 2020 */
SELECT CAST(FORMAT (CAST (#d AS INT), '##/##/####') as DATETIME)
Result returned is the original date string in #d as a DateTime.