posts - 0, comments - 1573, trackbacks - 0

Why does T-SQL have such limited support for date & time functions?

I have used T-SQL for quite a few years now and I have always wondered why it has such bad support for date and times?

OK, I can create a data type called DateTime, but where is the function to return just the date portion?

There are functions to return the Year, Month and Day of a DateTime variable, but not the hour, minute or second!

Now even with DateTime2 we do not really get a lot more functionality. It would seem very common to want to format a date and time in a custom way but none is provided.

Now I can write a whole set of functions in a .NET library and go through the process of getting them installed onto a SQL Server but why is this basic sort of functionality not supported in the product in native code.

I know a lot of people have written a lot of different T-SQL Solutions to formatting dates etc, but it seems to me that it would take a developer only 1 day to implement native functions into T-SQL that provide a lot more functionality than having to write c# code and load the SQL-CLR just to format a date!

Here is the latest date & time functions as listed by the SQL Server 2008 BOL.

SYSDATETIME
Returns a datetime2(7) value that contains the date and time of the computer on which the instance of SQL Server is running. The time zone offset is not included.

SYSDATETIMEOFFSET
Returns a datetimeoffset(7) value that contains the date and time of the computer on which the instance of SQL Server is running. The time zone offset is included.

SYSUTCDATETIME
Returns a datetime2(7) value that contains the date and time of the computer on which the instance of SQL Server is running. The date and time is returned as UTC time (Coordinated Universal Time).

CURRENT_TIMESTAMP
Returns a datetime2(7) value that contains the date and time of the computer on which the instance of SQL Server is running. The time zone offset is not included.

GETDATE
Returns a datetime2(7) value that contains the date and time of the computer on which the instance of SQL Server is running. The time zone offset is not included.

GETUTCDATE
Returns a datetime2(7) value that contains the date and time of the computer on which the instance of SQL Server is running. The date and time is returned as UTC time (Coordinated Universal Time).

DATENAME
Returns a character string that represents the specified datepart of the specified date.

DATEPART
Returns an integer that represents the specified datepart of the specified date.

DAY
Returns an integer that represents the day day part of the specified date.

MONTH
Returns an integer that represents the month part of a specified date.

YEAR
Returns an integer that represents the year part of a specified date.

DATEDIFF
Returns the number of date or time datepart boundaries that are crossed between two specified dates.

DATEADD
Returns a new datetime value by adding an interval to the specified datepart of the specified date.

SWITCHOFFSET
SWITCHOFFSET changes the time zone offset of a DATETIMEOFFSET value and preserves the UTC value.

TODATETIMEOFFSET
TODATETIMEOFFSET transforms a datetime2 value into a datetimeoffset value. The datetime2 value is interpreted in local time for the specified time_zone.

And here is MySQLs

ADDDATE()(v4.1.1)
Add dates

ADDTIME()(v4.1.1)
Add time

CONVERT_TZ()(v4.1.3)
Convert from one timezone to another

CURDATE()
Return the current date

CURRENT_DATE(), CURRENT_DATE
Synonyms for CURDATE()

CURRENT_TIME(), CURRENT_TIME
Synonyms for CURTIME()

CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP
Synonyms for NOW()

CURTIME()
Return the current time

DATE_ADD()
Add two dates

DATE_FORMAT()
Format date as specified

DATE_SUB()
Subtract two dates

DATE()(v4.1.1)
Extract the date part of a date or datetime expression

DATEDIFF()(v4.1.1)
Subtract two dates

DAY()(v4.1.1)
Synonym for DAYOFMONTH()

DAYNAME()(v4.1.21)
Return the name of the weekday

DAYOFMONTH()
Return the day of the month (0-31)

DAYOFWEEK()
Return the weekday index of the argument

DAYOFYEAR()
Return the day of the year (1-366)

EXTRACT
Extract part of a date

FROM_DAYS()
Convert a day number to a date

FROM_UNIXTIME()
Format UNIX timestamp as a date

GET_FORMAT()(v4.1.1)
Return a date format string

HOUR()
Extract the hour

LAST_DAY(v4.1.1)
Return the last day of the month for the argument

LOCALTIME(), LOCALTIME
Synonym for NOW()

LOCALTIMESTAMP, LOCALTIMESTAMP()(v4.0.6)
Synonym for NOW()

MAKEDATE()(v4.1.1)
Create a date from the year and day of year

MAKETIME(v4.1.1)
MAKETIME()

MICROSECOND()(v4.1.1)
Return the microseconds from argument

MINUTE()
Return the minute from the argument

MONTH()
Return the month from the date passed

MONTHNAME()(v4.1.21)
Return the name of the month

NOW()
Return the current date and time

PERIOD_ADD()
Add a period to a year-month

PERIOD_DIFF()
Return the number of months between periods

QUARTER()
Return the quarter from a date argument

SEC_TO_TIME()
Converts seconds to 'HH:MM:SS' format

SECOND()
Return the second (0-59)

STR_TO_DATE()(v4.1.1)
Convert a string to a date

SUBDATE()
A synonym for DATE_SUB() when invoked with three arguments

SUBTIME()(v4.1.1)
Subtract times

SYSDATE()
Return the time at which the function executes

TIME_FORMAT()
Format as time

TIME_TO_SEC()
Return the argument converted to seconds

TIME()(v4.1.1)
Extract the time portion of the expression passed

TIMEDIFF()(v4.1.1)
Subtract time

TIMESTAMP()(v4.1.1)
With a single argument, this function returns the date or datetime expression; with two arguments, the sum of the arguments

TIMESTAMPADD()(v5.0.0)
Add an interval to a datetime expression

TIMESTAMPDIFF()(v5.0.0)
Subtract an interval from a datetime expression

TO_DAYS()
Return the date argument converted to days

UNIX_TIMESTAMP()
Return a UNIX timestamp

UTC_DATE()(v4.1.1)
Return the current UTC date

UTC_TIME()(v4.1.1)
Return the current UTC time

UTC_TIMESTAMP()(v4.1.1)
Return the current UTC date and time

WEEK()
Return the week number

WEEKDAY()
Return the weekday index

WEEKOFYEAR()(v4.1.1)
Return the calendar week of the date (0-53)

YEAR()
Return the year

YEARWEEK()
Return the year and week

More details on the date & time functions in MySQL

http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html

Print | posted on Sunday, August 24, 2008 8:02 AM |

Feedback

Gravatar

# re: Why does T-SQL have such limited support for date & time functions?

Your statements are inaccurate. Simply use the DatePart Function. See Below.

Arguments
datepart
Is the parameter that specifies the part of the date to return. The table lists dateparts and abbreviations recognized by Microsoft® SQL Server™.


Datepart Abbreviations
year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y
day dd, d
week wk, ww
weekday dw
hour hh
minute mi, n
second ss, s
millisecond ms
12/16/2008 9:43 AM | Ani
Gravatar

# re: Why does T-SQL have such limited support for date & time functions?

I totally agree (with the main post, not the comment). I found this blog entry because I was trying to find a simple way to do some specific date formatting in TSQL without having to do multiple conversions and concatenations. One of the other posts on another blog (by an MVP) said that you shouldn't need to do date formatting in the database and that it should be handled in the front-end application. This is just silly. In my instance I want to do a group by clause using a year month combination (and have that display as a single value). I can do it, but it is way more work than if I was using MySQL or JetSQL. I don't get why MS doesn't have a more robust set of date functions.
12/19/2008 4:09 AM | Dave
Gravatar

# re: Why does T-SQL have such limited support for date & time functions?

I agree with Ani. you have all the functions you need to do anything you want in tsql.
4/24/2009 4:33 AM | Dm
Gravatar

# re: Why does T-SQL have such limited support for date & time functions?

I think DM and ANI are forgetting that TSQL is an interepted language and as such has a performance cost in running different conversions.

Native TSQL is written in c++ or even possibly assembler. Date arithmetic is expensive to do and should be nativly supported in the language.

I have written .NET code to perform what I need but why should I have to and then I need to enable .NET and have the overhead of the .NET Framework (SQL Version)

People have written for years that they can't even return a date without time without having to go online to find out how. It seems stupid to me causing people to write code to do something that a basic internal function should perform.

Maybe some people write very basic TSQL queries but I do not. And having to write TSQL code to perform the most basic date functions is not efficient, we all want SPEED at the end of the day. And speed comes from native mode code not TSQL artithmetic.
5/5/2009 9:11 PM | Chris crowe
Gravatar

# re: Why does T-SQL have such limited support for date & time functions?

I love they way people talk in theory " its so easy", those same people struggle with the same problem your having. It is a total joke.

The bottom line is TSQL should have everything mentioned above plus more functions to help microsoft developers to get the information out as needed.

I have been trying to work around the limits of sql server and it sucks.
3/24/2010 4:14 PM | MW
Gravatar

# re: Why does T-SQL have such limited support for date & time functions?

Just FYI - aside from DateTime,
there is also Date type in MSSQL.

(no time...just a date)
3/25/2010 1:16 PM | wb
Gravatar

# re: Why does T-SQL have such limited support for date & time functions?

I am another person who came across this post because I am looking for a function which can return the proper date to me and formatted the way I would like it formatted. Just another example of MS not listening to it's developers.
8/16/2010 11:57 AM | GM

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 5 and 5 and type the answer here:

Powered by:
Powered By Subtext Powered By ASP.NET