views:

75

answers:

4

I have legacy system where all date fields are maintained in YMD format. Example:

20101123
this is date: 11/23/2010

I'm looking for most optimal way to convert from number to date field.

Here is what I came up with:

declare @ymd int

set @ymd = 20101122

select @ymd, convert(datetime, cast(@ymd as varchar(100)), 112)

This is pretty good solution but I'm wandering if someone has better way doing it

+2  A: 

What you have is a pretty good soltuion.

Why are you looking for a better way?

Andomar
Since I have mullions of rows to convert - I'm looking for the fastest way to do it. Is this unusual?
IMHO
@IMHO: The date part conversion for a million rows should cost less than one second ;)
Andomar
+3  A: 

try this:

CONVERT(DATETIME, CONVERT(NVARCHAR, YYYYMMDD))

For example:

SELECT CONVERT(DATETIME, CONVERT(NVARCHAR, 20100401))

Results in:

2010-04-01 00:00:00.000
Richard Forss
This appears to be more efficient than mine and it looks better too. Thanks!
IMHO
why use NVARCHAR? char(8) would be more efficient.
KM
interesting twist - this does not work as Calculated field formula - any ideas?
IMHO
A: 

I use exactly that, it has been working fine for me

coderguy123
A: 

As it is stored as an integer then you could potential extract the year, month and day by dividing by 100, 1000.

e.g.

DECLARE @Date INT
SET @Date = 20100401

DECLARE @Year INT
DECLARE @Month INT
DECLARE @Day INT

SET @Year = @Date / 10000
SET @Month = (@Date - (@Year * 10000)) / 100
SET @Day = @Date - (@Year * 10000) - (@Month * 100)

SELECT @Date, DATEADD(MONTH,((@Year-1900)*12)+@Month-1,@Day-1)

However, I have no idea if that is faster than the string comparison you already have. I think your solution is far cleaner and easier to read and would stick with that.

Robin Day