Solved

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

Posted on 2007-11-20
14
332 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
PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

 

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

Migrating Your Company's PCs

To keep pace with competitors, businesses must keep employees productive, and that means providing them with the latest technology. This document provides the tips and tricks you need to help you migrate an outdated PC fleet to new desktops, laptops, and tablets.

Question has a verified solution.

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

Let's review the features of new SQL Server 2012 (Denali CTP3). It listed as below: PERCENT_RANK(): PERCENT_RANK() function will returns the percentage value of rank of the values among its group. PERCENT_RANK() function value always in be…
Why is this different from all of the other step by step guides?  Because I make a living as a DBA and not as a writer and I lived through this experience. Defining the name: When I talk to people they say different names on this subject stuff l…
Viewers will learn how to use the INSERT statement to insert data into their tables. It will also introduce the NULL statement, to show them what happens when no value is giving for any given column.
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…

792 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