I've written a lot of answers about date
or datetime
conversions from strings. Living in a german speaking country, I'm used to deal with non-us_english date formats and I'm used to use secure literals (I prefere the ODBC
format) and I never use CONVERT
without the third parameter. That is not the question and please do not provide answers in this direction...
Very often one can read, that a format yyyy-mm-dd
is standard (ISO8601, ANSI, whatever) and therefore culture independant.
Today I had to edit one of these older answers, as I had stated there, that the observed behaviour is depending on something else.
The question is:
Why (if there is a reason) is there a difference between DATE
and DATETIME
?
... at least in my environmen, which is SQL Server 2014 (12.0.4237.0) at the moment.
I hope, this was not asked before...
Try this:
No problems here, DATE
works as expected
SET LANGUAGE ENGLISH;
DECLARE @dt DATE='2017-01-13';
SELECT @dt;
SELECT CAST('2017-01-13' AS DATE);
SELECT CONVERT(DATE,'2017-01-13'); --no culture / format specified
GO
SET LANGUAGE GERMAN;
DECLARE @dt DATE='2017-01-13';
SELECT @dt;
SELECT CAST('2017-01-13' AS DATE);
SELECT CONVERT(DATE,'2017-01-13');
But now check the same with DATETIME
--No problem here:
SET LANGUAGE ENGLISH;
DECLARE @dt DATETIME='2017-01-13';
SELECT @dt;
SELECT CAST('2017-01-13' AS DATETIME);
SELECT CONVERT(DATETIME,'2017-01-13');
GO
--breaks, due to the "13" and would deliver a wrong result (even worse), if the "day" was not more than "12":
SET LANGUAGE GERMAN;
DECLARE @dt DATETIME='2017-01-13';
SELECT @dt;
SELECT CAST('2017-01-13' AS DATETIME);
SELECT CONVERT(DATETIME,'2017-01-13');
Is this a bug, purpose or just grubbiness?