Solved

# Function to convert date from text format YYYYDDD where DDD = number of days in the year

Posted on 2007-11-20
Medium Priority
361 Views
eg. select dbo.CnvDateYYYYDDD('2007305')  will return 31-Oct-2007

Thanks

0
Question by:xenium
• 8
• 4
• 2

Author Comment

ID: 20322507
i should say, where DDD = day of year !
0

LVL 143

Expert Comment

ID: 20322514
replace(convert(varchar(10), convert(datetime, '2007305', 112), 106), ' ', '-')
0

LVL 143

Expert Comment

ID: 20322562
sorry, posted to fast...

create function dbo.CnvDateYYYYDDD(@v varchar(7))
returns varchar(11)
as
begin
declare @d datetime
declare @res varchar(11)
set @d = dateadd(day, cast(right(@v, 3) as int) -1, convert(datetime, left(@v,4) + '01-01', 120))
set @v = replace(convert(varchar(11), @v, 106), ' ', '-')
return @v
end

0

Author Comment

ID: 20322615
select dbo.CnvDateYYYYDDD('2007305')

Server: Msg 241, Level 16, State 1, Procedure CnvDateYYYYDDD, Line 7
Syntax error converting datetime from character string.

0

Author Comment

ID: 20322730
this seems to work (several edits!)..

create function dbo.CnvDateYYYYDDD(@v varchar(7))
returns varchar(11)
as
begin
declare @d datetime
declare @res varchar(11)
set @d = dateadd(day, cast(right(@v, 3) as int)-1, convert(datetime, left(@v,4) + '-01-01', 120))
set @res = replace(convert(varchar(11), @d, 106), ' ', '-')
return @res
end

0

Author Comment

ID: 20322742
Correction also, select dbo.CnvDateYYYYDDD('2007305') correctly returns 1st-Nov-2007
0

Author Comment

ID: 20322780
Thanks for helping get the solution. Copy-paste the above corrected function for the points (just makes PAQ simpler)
0

LVL 143

Accepted Solution

Guy Hengel [angelIII / a3] earned 500 total points
ID: 20322797
set @res = replace(convert(varchar(11), @v, 106), ' ', '-')

set @res = replace(convert(varchar(11), @d, 106), ' ', '-')

sorry for that typo, I wrote the code directly here without checking..
``````create function dbo.CnvDateYYYYDDD(@v varchar(7))
returns varchar(11)
as
begin
declare @d datetime
declare @res varchar(11)
set @d = dateadd(day, cast(right(@v, 3) as int)-1, convert(datetime, left(@v,4) + '-01-01', 120))
set @res = replace(convert(varchar(11), @d, 106), ' ', '-')
return @res
end
``````
0

LVL 70

Expert Comment

ID: 20322837
Functions should be written *for efficiency* -- no extraneous variables, code, etc. -- rather than to show step-by-step logic.  For example:
``````CREATE FUNCTION dbo.CnvDateYYYYDDD(
@yyyyddd varchar(7)
)
RETURNS varchar(11)
AS
BEGIN
RETURN REPLACE(CONVERT(VARCHAR(11),
DATEADD(DAY, CAST(RIGHT(@yyyyddd, 3) AS INT) - 1, LEFT(@yyyyddd, 4) + '0101')
, 106), ' ', '-')
END
``````
0

Author Comment

ID: 20323005
Scott, thanks for the suggestion, i agree efficiency is important. Though in many cases human efficiency is more valuable than machine efficiency, so clearer coding may be preferred.
0

LVL 70

Expert Comment

ID: 20323254
>>  Though in many cases human efficiency is more valuable than machine efficiency <<

I wouldn't recommend that for functions -- you could end up noticeably slowing down your system.  When you start applying a function to every row of a table, efficiency can make a *big* difference, especially when the table goes from 100 rows to 100,000 or 1M rows for some reason.
0

LVL 143

Expert Comment

ID: 20323298
I do agree with ScottPletcher.
you should consider writing the function with the most effective code, and comment with the more human-readable version...
0

Author Comment

ID: 20324137
Ok thanks, fair point. Follow-up 1 coming up, as i need the output as Datetime..
0

Author Comment

ID: 20324150
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In the first part of this tutorial we will cover the prerequisites for installing SQL Server vNext on Linux.
This month, Experts Exchange sat down with resident SQL expert, Jim Horn, for an in-depth look into the makings of a successful career in SQL.
This videos aims to give the viewer a basic demonstration of how a user can query current session information by using the SYS_CONTEXT function
Viewers will learn how to use the SELECT statement in SQL and will be exposed to the many uses the SELECT statement has.
###### Suggested Courses
Course of the Month8 days, 22 hours left to enroll