I am new to development and want to know the professional way to deal with dates in SQL Server. In my applications mainly we deal with the DATE datatype and no concern with time part. Also maintaining the format dd/mm/yyyy
So for example if I have the table with the following structure.
EmployeeTable
---------------
emp_id int
emp_name varchar(50)
join_date date
and if I want to query "join_date" in between start date and end date and pass the dd/mm/yyyy as stored procedure criteria and want to query.
What i开发者_StackOverflow社区s the professional way to handle dates? I always convert date in varchar and then do the comparison which I guess is the unprofessional way of doing it. So please guide how to do it in procedure with example I would appreciate.
SQL handles dates just fine, so you do not need to convert the dates.
If you pass in the parameters as date
types, then you will have no problem:
CREATE PROCEDURE myProc
@start date,
@end date
AS
SELECT emp_id, emp_name, join_date
FROM EmployeeTable
WHERE join_date BETWEEN start AND end;
Unless you want to format a date in your output in a specific way, there's no reason to convert the date to a varchar
. You're using the date
datatype, so let SQL do the comparisons for you.
If you want to compare dates in a date range, you can use this:
WHERE join_date BETWEEN '2010-01-01' AND '2010-12-31'
Keep dates as dates. Do not convert it to strings. That is unnecessary. When you send dates in to SQL Server from your code, do it with parameters, then you don't have to worry about the right format in your strings.
SQL Server Date data types:
- Date: 0001-01-01 through 9999-12-31
- SmallDateTime: 1900-01-01 through 2079-06-06 (Accuracy 1 minute)
- DateTime: January 1, 1753, through December 31, 9999 (Accuracy millisecond)
- DateTime2: 0001-01-01 through 9999-12-31 (Accuracy 100 nanoseconds)
It's a minor point but worth noting that all queries presented to SQL Server are in TEXT. At some stage, based on some language and translation setting in the data access layer (OLEDB, Native, ADO) it gets turned into a textual form, so dates are always presented as "text".
The best format to use is always YYYYMMDD for SQL Server. Even YYYY-MM-DD can be wrong, for obscure dateformat settings. See this example.
set dateformat dmy -- more than common for non-US locations
select CONVERT(varchar, convert(datetime, '2010-12-31'), 112)
It fails.
Msg 242, Level 16, State 3, Line 3
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
That covers the format to use when you have to construct the date embedded in the SQL statement. When possible however, please parameterize queries for benefits like
- prevention of SQL injection
- letting the db connectivity layer ensure the right formats when generating the TSQL
- query plan re-use on the SQL Server
- point 3 = better performing queries and more efficient SQL Server
精彩评论