Please start any new threads on our new 
    site at https://forums.sqlteam.com.  We've got lots of great SQL Server
    experts to answer whatever question you can come up with. 
    
        
            
                
                    
                        
                            
                                | Author | 
                                
                                 Topic  | 
                             
                            
                                    | 
                                         vmon 
                                        Yak Posting Veteran 
                                         
                                        
                                        63 Posts  | 
                                        
                                        
                                            
                                            
                                             Posted - 2006-05-22 : 12:07:07
                                            
  | 
                                             
                                            
                                            | How can I build a date.  I am trying this but gettting a date of 7/2/1905 for the values 2006, 01, 01SELECT @txtProductLineUsrFld2, @txtYear, @txtForecast/12, CAST(((@txtYear) + '-' +  ('01')  + '-' + (@Counter) ) AS DATETIME)Thanks,vmon | 
                                             
                                         
                                     | 
                             
       
                            
                       
                          
                            
                                    | 
                                     nr 
                                    SQLTeam MVY 
                                     
                                    
                                    12543 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2006-05-22 : 12:10:23
                                          
  | 
                                         
                                        
                                          | What datatypes and values are in your variables?convert(datetime, @txtYear + '01' + @Counter)should work if the two variables are yyyy and dd and '01' is the month.It will end up with yyyymmdd==========================================Cursors are useful if you don't know sql.DTS can be used in a similar way.Beer is not cold and it isn't fizzy.  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     vmon 
                                    Yak Posting Veteran 
                                     
                                    
                                    63 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2006-05-22 : 12:16:17
                                          
  | 
                                         
                                        
                                          | They are just integers.  How would I make them yyyy and dd format?Thanks for you reply.vmon  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     nr 
                                    SQLTeam MVY 
                                     
                                    
                                    12543 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2006-05-22 : 12:33:59
                                          
  | 
                                         
                                        
                                          | how aboutconvert(datetime, convert(varchar(4),@txtYear) + '01' + right('00' + convert(varchar(2),@Counter),2))==========================================Cursors are useful if you don't know sql.DTS can be used in a similar way.Beer is not cold and it isn't fizzy.  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     RyanRandall 
                                    Master Smack Fu Yak Hacker 
                                     
                                    
                                    1074 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2006-05-22 : 12:42:11
                                          
  | 
                                         
                                        
                                          Or maybe...declare @year int, @month int, @day intselect @year = 2006, @month = 1, @day = 1select dateadd(day, @day - 1, dateadd(month, @month - 1, dateadd(year, @year-1900, 0))) Ryan Randallwww.monsoonmalabar.com London-based IT consultancy Solutions are easy. Understanding the problem, now, that's the hard part.  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     Kristen 
                                    Test 
                                     
                                    
                                    22859 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2006-05-22 : 12:45:40
                                          
  | 
                                         
                                        
                                            - Dead spooky that!I expect this is wildly inefficient, but:DECLARE	@year int, @month int, @day intSELECT	@year=2006, @month=12, @day=31SELECT	DATEADD(Day, @day-1, DATEADD(Month, @month-1, DATEADD(Year, @year-1900, 0))) It will allow invalid dates though - although that might be beneficial - you could add "365 days and 0 months" to a year,Kristen  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     RyanRandall 
                                    Master Smack Fu Yak Hacker 
                                     
                                    
                                    1074 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2006-05-22 : 13:04:11
                                          
  | 
                                         
                                        
                                          You're scaring me, Kristen    Ryan Randallwww.monsoonmalabar.com London-based IT consultancy Solutions are easy. Understanding the problem, now, that's the hard part.  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     Michael Valentine Jones 
                                    Yak DBA Kernel (pronounced Colonel) 
                                     
                                    
                                    7020 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2006-05-22 : 14:04:22
                                          
  | 
                                         
                                        
                                          quote: Originally posted by Kristen
   - Dead spooky that!I expect this is wildly inefficient, but:DECLARE	@year int, @month int, @day intSELECT	@year=2006, @month=12, @day=31SELECT	DATEADD(Day, @day-1, DATEADD(Month, @month-1, DATEADD(Year, @year-1900, 0))) It will allow invalid dates though - although that might be beneficial - you could add "365 days and 0 months" to a year,Kristen
  I doubt that your solution is really "wildly inefficient", but this is almost the same with one less function call.declare @year int, @month int, @day intselect	@year = 2006, @month = 1, @day = 16select dateadd(day,@day-1,dateadd(month,((@year-1900)*12)+@month-1,0)) CODO ERGO SUM  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     madhivanan 
                                    Premature Yak Congratulator 
                                     
                                    
                                    22864 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2006-05-23 : 03:04:09
                                          
  | 
                                         
                                        
                                          | Other approaches (Not sure about performance)declare @year int, @month int, @day intselect	@year = 2006, @month = 1, @day = 16Select cast(cast(@year*10000+@month*100+@day as char(8)) as datetime)Select cast(left(@year*10000+@month*100+@day ,8) as datetime)MadhivananFailing to plan is Planning to fail  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     RyanRandall 
                                    Master Smack Fu Yak Hacker 
                                     
                                    
                                    1074 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2006-05-23 : 06:33:45
                                          
  | 
                                         
                                        
                                          Nice idea Madhivanan. We can get that a tiny bit shorter (the importance of which cannot be underestimated  )...select cast(str(@year*10000+@month*100+@day) as datetime) Ryan Randallwww.monsoonmalabar.com London-based IT consultancy Solutions are easy. Understanding the problem, now, that's the hard part.  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     madhivanan 
                                    Premature Yak Congratulator 
                                     
                                    
                                    22864 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2006-05-23 : 09:27:21
                                          
  | 
                                         
                                        
                                          Yes it is  MadhivananFailing to plan is Planning to fail  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     Michael Valentine Jones 
                                    Yak DBA Kernel (pronounced Colonel) 
                                     
                                    
                                    7020 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2006-05-23 : 11:15:56
                                          
  | 
                                         
                                        
                                          This thread wouldn't be complete without a test.I used the following script to test the runtime of the various methods posted against a table with one million test dates.  I ran the tests a number of times, and got consistant results.As I suspected, the methods with dateadd were faster, and the ones that used character strings were much slower, taking 2.5 to 7 times as long.-- Load test datagodrop table #tset nocount offgoprint 'Load 1 million dates in random order'select	top 100 percent	DT,	[YEAR]	= year(a.DT),	[MONTH]	= month(a.DT),	[DAY]	= day(a.DT)into #tfrom(select	DT=dateadd(dd,aa.NUMBER,'17530101')from	dbo.F_TABLE_NUMBER_RANGE(0,999999) AA) aorder by	newid()goset nocount ongodeclare @start datetime, @end datetime, @count intselect @start = getdate()select	@count= count(*)from	#t awhere	a.DT <>	dateadd(day,a.day-1,dateadd(month,((a.year-1900)*12)+a.month-1,0))select [Elapsed MS - MVJ] = datediff(ms,@start,getdate())godeclare @start datetime, @end datetime, @count intselect @start = getdate()select	@count= count(*)from	#t awhere	a.DT <>	DATEADD(Day, a.day-1, DATEADD(Month, a.month-1, DATEADD(Year, a.year-1900, 0)))select [Elapsed MS - Kristen & Ryan] = datediff(ms,@start,getdate())godeclare @start datetime, @end datetime, @count intselect @start = getdate()select	@count= count(*)from	#t awhere	a.DT <>	cast(cast(a.year*10000+a.month*100+a.day as char(8)) as datetime)select [Elapsed MS - madhivanan 1] = datediff(ms,@start,getdate())godeclare @start datetime, @end datetime, @count intselect @start = getdate()select	@count= count(*)from	#t awhere	a.DT <>	cast(left(a.year*10000+a.month*100+a.day ,8) as datetime)select [Elapsed MS - madhivanan 2] = datediff(ms,@start,getdate())godeclare @start datetime, @end datetime, @count intselect @start = getdate()select	@count= count(*)from	#t awhere	a.DT <>	cast(str(a.year*10000+a.month*100+a.day) as datetime)select [Elapsed MS - Ryan 2] = datediff(ms,@start,getdate())go Results:Load 1 million dates in random order(1000000 row(s) affected)Elapsed MS - MVJ ---------------- 1076Elapsed MS - Kristen & Ryan --------------------------- 1220Elapsed MS - madhivanan 1 ------------------------- 2703Elapsed MS - madhivanan 2 ------------------------- 5050Elapsed MS - Ryan 2 ------------------- 7153 CODO ERGO SUM  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     RyanRandall 
                                    Master Smack Fu Yak Hacker 
                                     
                                    
                                    1074 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2006-05-23 : 11:34:42
                                          
  | 
                                         
                                        
                                          Well done Michael! No surprises about the results, but good to confirm what we'd probably all have suspected.You truly are the 'date master'  Ryan Randallwww.monsoonmalabar.com London-based IT consultancy Solutions are easy. Understanding the problem, now, that's the hard part.  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     Michael Valentine Jones 
                                    Yak DBA Kernel (pronounced Colonel) 
                                     
                                    
                                    7020 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2006-05-23 : 12:17:23
                                          
  | 
                                         
                                        
                                          quote: Originally posted by RyanRandall...No surprises about the results, but good to confirm what we'd probably all have suspected...
  Nothing like actual test with real numbers.CODO ERGO SUM  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     madhivanan 
                                    Premature Yak Congratulator 
                                     
                                    
                                    22864 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2006-05-24 : 03:27:00
                                          
  | 
                                         
                                        
                                          Thanks MVJ for the tests  MadhivananFailing to plan is Planning to fail  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     Kristen 
                                    Test 
                                     
                                    
                                    22859 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2006-05-24 : 05:13:59
                                          
  | 
                                         
                                        
                                          I wonder if I did a test if my result would have the best time?    | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     Michael Valentine Jones 
                                    Yak DBA Kernel (pronounced Colonel) 
                                     
                                    
                                    7020 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2006-05-24 : 06:40:04
                                          
  | 
                                         
                                        
                                          quote: Originally posted by Kristen I wonder if I did a test if my result would have the best time?  
  Why not give it a shot?CODO ERGO SUM  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     khtan 
                                    In (Som, Ni, Yak) 
                                     
                                    
                                    17689 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2006-05-24 : 06:44:06
                                          
  | 
                                         
                                        
                                          Any difference betweenSELECT DATEADD(Day, @day - 1, DATEADD(Month, @month - 1, DATEADD(Year, @year - 1900, 0)))and this ?SELECT @day - 1 + DATEADD(Month, @month - 1, DATEADD(Year, @year - 1900, 0))  KH  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     Michael Valentine Jones 
                                    Yak DBA Kernel (pronounced Colonel) 
                                     
                                    
                                    7020 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2006-05-24 : 11:41:10
                                          
  | 
                                         
                                        
                                          quote: Originally posted by khtan Any difference betweenSELECT DATEADD(Day, @day - 1, DATEADD(Month, @month - 1, DATEADD(Year, @year - 1900, 0)))and this ?SELECT @day - 1 + DATEADD(Month, @month - 1, DATEADD(Year, @year - 1900, 0))  KH
  I ran some tests and didn't see any difference in performance between them.CODO ERGO SUM  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     Michael Valentine Jones 
                                    Yak DBA Kernel (pronounced Colonel) 
                                     
                                    
                                    7020 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2007-01-27 : 16:26:50
                                          
  | 
                                         
                                        
                                          I decided to beat this long dead horse one last time.I found an even shorter piece of code to build a date, which is also faster than any of methods that I tested above.  It uses only one DATEADD function call, so that is probably why it is faster.declare @year int, @month int, @day intselect	@year = 2006, @month = 1, @day = 16select dateadd(month,((@Year-1900)*12)+@Month-1,@Day-1) I tested with this code to compare it to the fastest method from the tests I posted on 2006/5/23:drop table #tset nocount offgoprint 'Load 3 million dates in random order'create table #t (DT datetime not null,[YEAR]	int not null,[MONTH]	int not null,[DAY]	int not null)insert into  #tselect	top 100 percent	DT,	[YEAR]	= year(a.DT),	[MONTH]	= month(a.DT),	[DAY]	= day(a.DT)from(select	DT=dateadd(dd,aa.NUMBER,'17530101')from	dbo.F_TABLE_NUMBER_RANGE(0,2999999) AA) aorder by	newid()goset nocount ongodeclare @start datetime, @end datetime, @count intselect @start = getdate()select	@count= count(*)from	#t awhere	a.DT <>	dateadd(day,a.day-1,dateadd(month,((a.year-1900)*12)+a.month-1,0))select [Elapsed MS - MVJ Old] = datediff(ms,@start,getdate())godeclare @start datetime, @end datetime, @count intselect @start = getdate()select	@count= count(*)from	#t awhere	a.DT <>	dateadd(month,((a.year-1900)*12)+a.month-1,a.day-1)select [Elapsed MS - MVJ New] = datediff(ms,@start,getdate())go It gave small but consistent difference in run time:Elapsed MS - MVJ Old -------------------- 5340Elapsed MS - MVJ New -------------------- 4616Elapsed MS - MVJ Old -------------------- 5260Elapsed MS - MVJ New -------------------- 4586 CODO ERGO SUM  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                            
                                | 
                                    
                                      
                                     
                                    
                                 | 
                             
                         
                     | 
                 
             
         |   
     
     
            
              
	     |  
		
			
     
          
		 |