Solved

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

Posted on 2007-11-20
315 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 142

Expert Comment

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

LVL 142

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 142

Accepted Solution

Guy Hengel [angelIII / a3] earned 125 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 69

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 69

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 142

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

### Suggested Solutions

I wrote this interesting script that really help me find jobs or procedures when working in a huge environment. I could I have written it as a Procedure but then I would have to have it on each machine or have a link to a server-related search that â€¦
Ever needed a SQL 2008 Database replicated/mirrored/log shipped on another server but you can't take the downtime inflicted by initial snapshot or disconnect while T-logs are restored or mirror applied? You can use SQL Server Initialize from Backupâ€¦
Via a live example, show how to extract information from SQL Server on Database, Connection and Server properties
Viewers will learn how to use the SELECT statement in SQL to return specific rows and columns, with various degrees of sorting and limits in place.