All About Datetime
All About Datetime
DATETIME
Madhivanan
SQL Server MVP
www.chnsqlug.co.cc
www.sql-articles.com
Internal Storage
www.chnsqlug.co.cc
www.sql-articles.com
www.chnsqlug.co.cc
www.sql-articles.com
select
dateadd(day,40155, '1900-01-01') as date,
dateadd(millisecond,66775873,dateadd(day,40155, '1900-0101')) as source_date
date
source_date
------------------------------------------------------------------------2009-12-10 00:00:00.000
2009-12-10 18:32:55.873
www.chnsqlug.co.cc
www.sql-articles.com
Datetime
Minimum value : January 1, 1753
Maximum value :December 31, 9999
Smalldatetime
Minimum value : January 1, 1900
Maximum value :June 6, 2079
Date Ranges
www.chnsqlug.co.cc
www.sql-articles.com
Rounding
Datetime value is rounded to
0.000,0.003 or 0.007 milliseconds
Example
select cast('2010-01-01 12:45:34.755' as datetime)
Result
---------------------------------2010-01-01 12:45:34.757
Datetime
www.chnsqlug.co.cc
www.sql-articles.com
Rounding numbers
Last digit of the millisecond
Rounded value
0 or 1
2,3 or 4
5,6,7 or 8
9
digit)
www.chnsqlug.co.cc
0 ( increase previous
www.sql-articles.com
Examples
Datetime value
Rounded value
01/01/98 23:59:59.990 or
01/01/98 23:59:59.991
1998-01-01 23:59:59.990
01/01/98 23:59:59.992,
01/01/98 23:59:59.993, or
01/01/98 23:59:59.994
1998-01-01 23:59:59.993
01/01/98 23:59:59.995,
01/01/98 23:59:59.996,
01/01/98 23:59:59.997, or
01/01/98 23:59:59.998
1998-01-01 23:59:59.997
01/01/98 23:59:59.999
1998-01-02 00:00:00.000
www.chnsqlug.co.cc
www.sql-articles.com
Rounding
SmallDatetime value is rounded to 1 minute
Values of 29.998 seconds or less are rounded down to the nearest minute;
values of 29.999 seconds or more are rounded up to the nearest minute.
Example
select
cast('2010-01-01 12:45:24.755' as smalldatetime),
cast('2010-01-01 12:45:34.755' as smalldatetime)
Result
-----------------------------------------------------------------2010-01-01 12:45:00
2010-01-01 12:46:00
SmallDatetime
www.chnsqlug.co.cc
www.sql-articles.com
Millisecond expression
select
cast('2010-01-01 12:45:34.79' as datetime),
cast('2010-01-01 12:45:34:79' as datetime)
Result
---------------------------------------------------------------------------2010-01-01 12:45:34.790
2010-01-01 12:45:34.080
www.chnsqlug.co.cc
www.sql-articles.com
Date as number
www.chnsqlug.co.cc
www.sql-articles.com
Usual method
www.sql-articles.com
Efficient method
Select dateadd(day,datediff(day,0,@date),0)
Result
-------------------------------2010-12-15 00:00:00.000
www.chnsqlug.co.cc
www.sql-articles.com
www.chnsqlug.co.cc
www.sql-articles.com
Method 2
(Date handling)
select dateadd(month,datediff(month,0,@date),0)
Result
----------------------2010-03-01 00:00:00.000
www.chnsqlug.co.cc
www.sql-articles.com
Result
----------------------2010-01-01 00:00:00.000
www.chnsqlug.co.cc
www.sql-articles.com
Method 2
(Date handling)
select dateadd(year,datediff(year,0,@date),0)
Result
----------------------2010-01-01 00:00:00.000
www.chnsqlug.co.cc
www.sql-articles.com
Sample Queries
www.chnsqlug.co.cc
www.sql-articles.com
Correct Methods
Method 1
Select columns from table
Where datediff(day,date_col,getdate())=1
Method 2
www.chnsqlug.co.cc
www.sql-articles.com
Wrong method
Select columns from table
Where date_col=dateadd(month,-1,getdate())
www.chnsqlug.co.cc
www.sql-articles.com
Correct Methods
Method 1
Select columns from table
Where datediff(month,date_col,getdate())=1
Method 2
Select columns from table
Where
date_col>=dateadd(month,datediff(month,0,getdate())-1,0) and
date_col<dateadd(month,datediff(month,0,getdate()),0)
www.chnsqlug.co.cc
www.sql-articles.com
Unambiguous formats
YYYYMMDD HH:MM:SS
YYYY-MM-DDTHH:MM:SS
Ambiguous formats
DD/MM/YYYY
MM/DD/YYYY
DD-MM-YYYY
MM-DD-YYYY
YYYY-MM-DD
Etc
Date Formats
www.chnsqlug.co.cc
www.sql-articles.com
www.chnsqlug.co.cc
www.sql-articles.com
www.chnsqlug.co.cc
www.sql-articles.com
Dbcc useroptions
Set options
Value
----------------------------------language
us_english
dateformat
mdy
datefirst
7
.
.
.
.
www.chnsqlug.co.cc
www.sql-articles.com
Dateformats
mdy mm/dd/yyyy, mm.dd.yyyy, mm-dd-yyyy
dmy dd/mm/yyyy, dd.mm.yyyy, dd-mm-yyyy
ymd yyyy/mm/dd, yyyy.mm.dd, yyyy-mm-dd
ydm yyyy/dd/mm, yyyy.dd.mm, yyyy-dd-mm
Etc
www.chnsqlug.co.cc
www.sql-articles.com
dates
----------------------2010-03-12 00:00:00.000
2009-03-27 00:00:00.000
www.chnsqlug.co.cc
www.sql-articles.com
www.chnsqlug.co.cc
www.sql-articles.com
www.chnsqlug.co.cc
www.sql-articles.com
www.chnsqlug.co.cc
www.sql-articles.com
www.chnsqlug.co.cc
www.sql-articles.com
dates
----------------------2010-03-12 00:00:00.000
2009-03-27 00:00:00.000
www.chnsqlug.co.cc
www.sql-articles.com
Reasons
It depends on the date settings
It does implicit convertion
Unreliable ISDATE()
function
www.chnsqlug.co.cc
www.sql-articles.com
www.sql-articles.com
www.chnsqlug.co.cc
www.sql-articles.com
www.chnsqlug.co.cc
www.sql-articles.com
www.chnsqlug.co.cc
www.sql-articles.com
Dates
----------------20071201
2007
2007
1800
www.chnsqlug.co.cc
www.sql-articles.com
dates
-------20071201
www.chnsqlug.co.cc
www.sql-articles.com
declare @d datetime
set @d='2008-10-12 16:32:18'
select
convert(varchar(10),@d,101),
convert(varchar(10),@d,103),
convert(varchar(30),@d,109),
convert(varchar(10),@d,112)
---------- ---------------------------------------- ------------------------------ --------10/12/2008 12/10/2008 Oct 12 2008 4:32:18:000PM 20081012
Date formations
www.chnsqlug.co.cc
www.sql-articles.com
www.chnsqlug.co.cc
www.sql-articles.com
www.chnsqlug.co.cc
www.sql-articles.com
Thank You
Write your questions @
[email protected]
www.chnsqlug.co.cc
www.sql-articles.com