Is it possible to convert a varchar of 5122012 to a datetime of 05/12/2012?
Thanks
First of all you can't do it without trailing zeros of day and month. So your input data must be something like:
05122012
Second it is better to use the "native" format of:
20121205
what the server understands anyway
If it is the only way to get the data as you presented you would need a function to test and return the date
Basic function would be like this (SQL Server 2008 example):
This function works if the input data is: 05122012 if you need without trailing 0 you need to add the checks for that to the function
create function [dbo].[Str2Date] ( #data as varchar(8))
returns datetime
AS
begin
declare #day char(2), #mon char(2), #year char(4)
set #day = substring(#data,1,2)
set #mon = substring(#data,3,2)
set #year = substring(#data,5,4)
set #data = #year+#mon+#day
return convert (datetime,#data,112)
end
select dbo.Str2Date('05122012')
Related
#Rdatetime ='2017-04-18 11:49:38.633'
#Date to add = 2
#Output = '2017-04-20 11:49:38.633'
Hi all,
This is my Problem , i am getting Rdatetime and date to be added in another table . i have yo add the date and save it in datetime format
thanks in advance
Use DATEADD built in function :
DECLARE #Rdatetime DATETIME ='2017-04-18 11:49:38.633'
DECLARE #Date INT = 2
DECLARE #Output DATETIME = DATEADD(DAY,#Date,#Rdatetime)
SELECT #Output
You can make use DATEADD function by giving D as the first parameter.Then the number of days you want to add and the date to which you want to add.
SET #Output=DATEADD(D,#Date,#Rdatetime)
How can I convert VARCHAR data like '20130120161643730' to DATETIME ?
CONVERT(DATETIME, '20130120161643730') does not work.
However, CONVERT (DATETIME, '20130120 16:16:43:730') works. I guess it needs data in correct format.
Is there a valid way that can be used to convert to DATETIME directly from unformatted data ?
My solution is :
DECLARE #Var VARCHAR(100) = '20130120161643730'
SELECT CONCAT(LEFT(#Var,8),' ',SUBSTRING(#var,9,2),':',SUBSTRING(#var,11,2),':',SUBSTRING(#var,13,2),':',RIGHT(#Var,3))
It works fine. However, I'm looking for a compact solution.
You can make it a little more compact by not forcing the dashes, and using STUFF instead of SUBSTRING:
DECLARE #Var VARCHAR(100) = '20130120161643730';
SET #Var = LEFT(#Var, 8) + ' '
+ STUFF(STUFF(STUFF(RIGHT(#Var, 9),3,0,':'),6,0,':'),9,0,'.');
SELECT [string] = #Var, [datetime] = CONVERT(DATETIME, #Var);
Results:
string datetime
--------------------- -----------------------
20130120 16:16:43.730 2013-01-20 16:16:43.730
DECLARE #var VARCHAR(100) = '20130120161643730'
SELECT convert(datetime,(LEFT(#var,8)+' '+SUBSTRING(#var,9,2)+':'+SUBSTRING(#var,11,2)+':'+SUBSTRING(#var,13,2)+':'+RIGHT(#var,3)))
The only possible way to convert this type of string to date time is to break it and then convert it to DateTime. Also, Concat doesnt work in MS SQL but "+".
Assuming this format is something you work with regularly, something more compact would be to create a UDF (user defined function) that parses the string into a valid datetime.
So something along the lines of:
create function dbo.ParseDate (#var varchar(max)) returns datetime as
begin
return (convert(datetime,(LEFT(#var,8)+' '+SUBSTRING(#var,9,2)+':'+SUBSTRING(#var,11,2)+':'+SUBSTRING(#var,13,2)+':'+RIGHT(#var,3))))
end
You could then select from that function like this:
select dbo.ParseDate('20130120161643730')
So any code that needed to reference the date would be more compact.
I have a function which converts all of the strings to datetime.
ALTER FUNCTION formatit(
#fromtime VARCHAR(50) -- varchar
)
RETURNS DATETIME
AS
BEGIN
DECLARE #from datetime
IF (CHARINDEX('NOON',#fromtime,0)) = 0
SET #from = CONVERT(DATETIME, #fromtime)
ELSE
SET #from =CONVERT(DATETIME, '01/01/2000 12pm')
RETURN(#from)
END
SELECT dbo.formatit('04/12/2011 12 ')
So when u see the last select stmt it throws an error saying:
The conversion of a char data type to a datetime data type
resulted in an out-of-range datetime value.
It works fine if i give time 4 pm or 4:00. But it gives an error if i give just 4. Kindly let me know how i can handle this?
You could add a lot of code to look at the string and see if there is a ':' (like you have code to look for NOON). The problem is that if the string ends in 12PM the conversion will work too. So you would have to do something like
ALTER FUNCTION formatit(
#fromtime VARCHAR(50) -- varchar
)
RETURNS DATETIME
AS
BEGIN
DECLARE #from datetime
IF (CHARINDEX('NOON',#fromtime,0)) <> 0
BEGIN
SET #from =CONVERT(DATETIME, '01/01/2000 12pm')
END
ELSE IF (CHARINDEX('PM',#fromtime,0)) = 0 AND (CHARINDEX('AM',#fromtime,0)) = 0 AND (CHARINDEX(':',#fromtime,0)) = 0
BEGIN
SET #fromtime = #fromtime+':00'
SET #from =CAST(#fromtime AS datetime)
END
ELSE
BEGIN
SET #from =CAST(#fromtime AS datetime)
END
return(#from)
END
It looks like whitespace is ignored - I tried these and they all worked...
SELECT dbo.formatit('04/12/2011 12 ')
SELECT dbo.formatit('04/12/2011 12:00')
SELECT dbo.formatit('04/12/2011 12PM')
SELECT dbo.formatit('04/12/2011 12AM')
SELECT dbo.formatit('NOON')
Really you should look at the data you are using to feed this function with something other than TSQL so you have a better string parser.
Your call to dbo.formatit('04/12/2011 12 ') results in a call to convert(datetime, '04/12/2011 12 '). This string is not a valid input to convert to a date/time value.
See the list of formats in the CAST and CONVERT reference in MSDN. If you need to convert this string, you will need to change the time portion into "12:00PM" or just "12:00" (which is assumed to be in the 24-hour format).
First, I would find all the unique time occurrences in your table, something like:
select distinct rtrim(substring(#timeField,charindex(' ',#timeField)+1,99))
as TimePortion
This will give you a sense of what you are dealing with.
Then, in your function, break apart the date and time portions...
Now, based on what you found from the query, you need to spell out what to do with the times you find. For example, if the time portion is numeric, you might simply append :00 to it (i.e. 4 becomes 4:00). If you see NOON, you might replace it with 12:00pm, etc.
ALTER FUNCTION formatit( #fromtime VARCHAR(50) )
RETURNS DATETIME
AS
BEGIN
declare #dtPortion VARCHAR(12)
declare #tmPortion VARCHAR(32)
declare #x INT
SET #x = charindex(' ',#fromTime)
SET #dtPortion = left(#fromTime,#x-1)
SET #tmPortion = rtrim(substring(#fromTime,#x+1,99))
-- Figure out what to do
SELECT #FromTime =
CASE
WHEN IsNumeric(#tmPortion) = 1 THEN #dtPortion+' '+#tmPortion+':00'
WHEN #tmPortion = 'NOON' THEN #dtPortion+' 12:00pm'
ELSE
#dtPortion+' 12:00pm'
END
SET #from =CONVERT(DATETIME, '01/01/2000 12pm')
RETURN(#from)
END
Go
Hope this gets you started
I have been writing a user-defined function in SQL Server:
It looks like this :
CREATE FUNCTION FormatDate(#fromtime nvarchar(50))
RETURNS DATETIME
AS
BEGIN
DECLARE #tempfrom datetime
DECLARE #tempto nvarchar(50)
set #tempfrom = Convert(datetime, #fromtime, 100)
RETURN #tempfrom
END
select dbo.FormatDate('08/17/2010 4:30')
When I try to run this, I get the following error:
Conversion failed when converting the nvarchar value '08/17/2010 4:30' to data type int.
What am I doing wrong?
The 100 you're specifying in the convert is used to format when you're selecting data, not to format the storage of data.
Datetime is just stored as datetime - that's it (i mean, dependent on your SQL settings, it might be MM/DD/YYYY or DD/MM/YYYY).
But if you just do this:
set #tempfrom = Convert(datetime, #fromtime)
it's now a datetime, which you can convert to your desired formatting by wrapping it in another convert:
convert(varchar, convert(datetime, #fromtime), 100)
Why are you using style 100?
CREATE FUNCTION dbo.FormatDate -- schema prefix always!
(
#fromtime VARCHAR(50) -- varchar
)
RETURNS DATETIME
AS
BEGIN -- don't need variables anywhere
RETURN(CONVERT(DATETIME, #fromtime));
END
GO
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.