Solved

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

Posted on 2007-11-20
14
318 Views
Last Modified: 2008-03-03
eg. select dbo.CnvDateYYYYDDD('2007305')  will return 31-Oct-2007

Thanks



0
Comment
Question by:xenium
  • 8
  • 4
  • 2
14 Comments
 

Author Comment

by:xenium
ID: 20322507
i should say, where DDD = day of year !
0
 
LVL 142

Expert Comment

by:Guy Hengel [angelIII / a3]
ID: 20322514
replace(convert(varchar(10), convert(datetime, '2007305', 112), 106), ' ', '-')
0
 
LVL 142

Expert Comment

by:Guy Hengel [angelIII / a3]
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

by:xenium
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

by:xenium
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

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

Author Comment

by:xenium
ID: 20322780
Thanks for helping get the solution. Copy-paste the above corrected function for the points (just makes PAQ simpler)
0
Best Practices: Disaster Recovery Testing

Besides backup, any IT division should have a disaster recovery plan. You will find a few tips below relating to the development of such a plan and to what issues one should pay special attention in the course of backup planning.

 
LVL 142

Accepted Solution

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

instead of
 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

Open in new window

0
 
LVL 69

Expert Comment

by:Scott Pletcher
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

Open in new window

0
 

Author Comment

by:xenium
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

by:Scott Pletcher
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

by:Guy Hengel [angelIII / a3]
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

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

Author Comment

by:xenium
ID: 20324150
0

Featured Post

[Webinar] Disaster Recovery and Cloud Management

Learn from Unigma and CloudBerry industry veterans which providers are best for certain use cases and how to lower cloud costs, how to grow your Managed Services practice in IaaS clouds, and how to utilize public cloud for Disaster Recovery

Question has a verified solution.

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

Load balancing is the method of dividing the total amount of work performed by one computer between two or more computers. Its aim is to get more work done in the same amount of time, ensuring that all the users get served faster.
For both online and offline retail, the cross-channel business is the most recent pattern in the B2C trade space.
This video shows, step by step, how to configure Oracle Heterogeneous Services via the Generic Gateway Agent in order to make a connection from an Oracle session and access a remote SQL Server database table.
Via a live example, show how to backup a database, simulate a failure backup the tail of the database transaction log and perform the restore.

863 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

23 Experts available now in Live!

Get 1:1 Help Now