How Can I use "Date" Datatype in sql server?
You do not have a problem with the "last two".
However, you do have a problem with all of them, but one point after the other.
Literal dates are dependent on your system's culture
Your dates are interpreted as MM-DD-YYYY. This intrepretation is depenent on your system's culture. The first three are turning into wrong dates but work. The 4th breaks and the fifth is never executed (due to the error before).
So the actual error lies on line 4.
Whenever you deal with dates, use culture independent formats. It is better to use either of the following-
universal format
20150730 (=> the 30th of July in 2015)
ODBC-format
{d'2015-07-30'} or {t'23:30:59'} or {ts'2015-07-30 23:30:59'}
ISO 8601
'2015-07-30T00:00:00'
I'm assuming the error you're receiving is:
Conversion failed when converting date and/or time from character string.
The only other error that I could see you getting from the data you've provided is a FOREIGN KEY
violation. However, as you indicated that the third INSERT
passed, and the fourth uses the same foreign key ID, that does not appear to be the case.
So, the reason you're getting this error is due to the provided DATEFORMAT
not being in the expected format.
The ANSI Standard way of representing a DATE
is in the format YYYY-MM-DD
. The format you've provided appears to be in DD-MM-YYYY
, but the default for your session looks like it's expecting MM-DD-YYYY
, which results in the following dates being interpreted in the INSERT
:
Order_ID Order_Date
--------------------------
1 Feb 02 2015
2 May 08 2015
3 Jan 08 2015
4 (30th month?) 07 2015
^- This is the part that's erring.
Since your intent appears to be DD-MM-YYYY
, you can address this two ways:
- Changing the
DATE
formats to the ANSI Standard:
Insert Into #Orders(Order_ID, Book_name, isbn, Customer_ID, Order_date) values (1, 'Design User Interface',9345678210123, 1, '2015-08-02');
Insert Into #Orders(Order_ID, Book_name, isbn, Customer_ID, Order_date) values (2, 'Fire',9654693261489, 1, '2015-08-05');
Insert Into #Orders(Order_ID, Book_name, isbn, Customer_ID, Order_date) values (3, 'The Odyssey',9654864332511, 2, '2015-08-01');
Insert Into #Orders(Order_ID, Book_name, isbn, Customer_ID, Order_date) values (4, 'Anatomy',9654877777755, 2, '2015-07-30');
Insert Into #Orders(Order_ID, Book_name, isbn, Customer_ID, Order_date) values (5, 'Surgery',9654864951753, 2, '2015-07-01');
- Change the
DATEFORMAT
for the transaction:
Set DateFormat dmy
Insert Into #Orders(Order_ID, Book_name, isbn, Customer_ID, Order_date) values (1, 'Design User Interface',9345678210123, 1, '02-08-2015');
Insert Into #Orders(Order_ID, Book_name, isbn, Customer_ID, Order_date) values (2, 'Fire',9654693261489, 1, '05-08-2015');
Insert Into #Orders(Order_ID, Book_name, isbn, Customer_ID, Order_date) values (3, 'The Odyssey',9654864332511, 2, '01-08-2015');
Insert Into #Orders(Order_ID, Book_name, isbn, Customer_ID, Order_date) values (4, 'Anatomy',9654877777755, 2, '30-07-2015');
Insert Into #Orders(Order_ID, Book_name, isbn, Customer_ID, Order_date) values (5, 'Surgery',9654864951753, 2, '01-07-2015');
I would personally recommend the first option, as it's a better habit to get into when referencing dates.