Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

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

Posted on 2007-11-20
14
Medium Priority
?
358 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 143

Expert Comment

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

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
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 

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
 
LVL 143

Accepted Solution

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

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 70

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 143

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

Free learning courses: Active Directory Deep Dive

Get a firm grasp on your IT environment when you learn Active Directory best practices with Veeam! Watch all, or choose any amount, of this three-part webinar series to improve your skills. From the basics to virtualization and backup, we got you covered.

Question has a verified solution.

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

Windocks is an independent port of Docker's open source to Windows.   This article introduces the use of SQL Server in containers, with integrated support of SQL Server database cloning.
An alternative to the "For XML" way of pivoting and concatenating result sets into strings, and an easy introduction to "common table expressions" (CTEs). Being someone who is always looking for alternatives to "work your data", I came across this …
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 UPDATE and DELETE statements to change or remove existing data from their tables. Make a table: Update a specific column given a specific row using the UPDATE statement: Remove a set of values using the DELETE s…

916 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