我写过很多关于字符串转换为
经常可以看到,格式
今天我不得不编辑其中一个旧答案,因为我曾经说过,观察到的行为取决于其他事情。
问题是:
为什么(如果有原因)
...至少在我的环境中,SQL Server 2014(12.0.4237.0)目前是如此。
我希望这以前没有被问过...
试试这个:
没有问题,在这里
这是一个bug、故意的还是无心之失?
date
或datetime
的答案。作为生活在德语国家的人,我习惯于处理非美式英语日期格式,并且我习惯使用安全文字(我更喜欢ODBC
格式),我从不使用没有第三个参数的CONVERT
。这不是问题,请不要在这个方向上提供答案...经常可以看到,格式
yyyy-mm-dd
是标准的(ISO8601、ANSI等),因此与文化无关。今天我不得不编辑其中一个旧答案,因为我曾经说过,观察到的行为取决于其他事情。
问题是:
为什么(如果有原因)
DATE
和DATETIME
之间存在差异?...至少在我的环境中,SQL Server 2014(12.0.4237.0)目前是如此。
我希望这以前没有被问过...
试试这个:
没有问题,在这里
DATE
按预期工作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');
现在用 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');
这是一个bug、故意的还是无心之失?
Msg 241,Level 16,State 1,Line 3 Fehler beim Konvertieren einer Zeichenfolge in ein Datum und/oder eine Uhrzeit.
这基本上意味着:在转换日期和/或时间戳时出错。没有中间的“T”格式对于英语以外的语言不起作用-请参见Zohar下面的出色回答。 - marc_sSET LANGUAGE GERMAN; SELECT DATENAME(MONTH, CONVERT(DateTime, '2017-01-12 00:00:00'));
结果为“Dezember”。如果你的日期部分是13,你将会得到一个错误信息 - “Bei der Konvertierung eines varchar-Datentyps in einen datetime-Datentyp liegt der Wert außerhalb des gültigen Bereichs。” - 我假设这个错误信息在德语版本中也是如此。 - Zohar Peled