SQL Server 不存储DateTime
任何字符串格式 - 它存储为 8 字节数值。
各种设置(语言、日期格式)仅影响DateTime
在 SQL Server Management Studio 中向您显示 - 或者当您尝试将字符串转换为DateTime
.
SQL Server 支持多种格式 - 请参阅MSDN 有关 CAST 和 CONVERT 的在线书籍 http://msdn.microsoft.com/en-us/library/ms187928.aspx。大多数这些格式是依赖的根据您的设置 - 因此,这些设置有时可能有效 - 有时则无效。
所以如果有可能的话不转换之间的日期DateTime
并一直串起来!将其保留为DateTime
在 .NET 中,使用DATE
or DATETIME2(n)
在 SQL Server 中,并让日期采用其本机格式。使用参数化查询支持原生的DateTime
数据类型所以你不需要将日期转换为字符串并返回!
如果出于某种原因必须使用字符串来表示日期,解决此问题的唯一可靠方法是使用(稍作修改)ISO-8601 日期格式SQL Server 支持 - 这种格式有效always- 无论您的 SQL Server 语言和日期格式设置如何。
The ISO-8601 格式 http://msdn.microsoft.com/en-us/library/ms180878.aspxSQL Server 支持两种类型:
-
YYYYMMDD
仅适用于日期(无时间部分);请注意:没有破折号!,这非常重要!YYYY-MM-DD
is NOT独立于 SQL Server 中的日期格式设置,并且将NOT在所有情况下都可以工作!
or:
-
YYYY-MM-DDTHH:MM:SS
对于日期和时间 - 请注意:此格式has破折号(但他们can被省略)和一个固定的T
作为日期和时间部分之间的分隔符DATETIME
.
这对于 SQL Server 2000 及更高版本有效。
如果您使用 SQL Server 2008 或更高版本并且DATE
数据类型(仅DATE
- not DATETIME
!),那么你确实也可以使用YYYY-MM-DD
格式,并且也适用于 SQL Server 中的任何设置。
不要问我为什么整个主题如此棘手且有些令人困惑——事情就是这样。但随着YYYYMMDD
格式,您应该适合任何版本的 SQL Server 以及 SQL Server 中的任何语言和日期格式设置。
对于 SQL Server 2008 及更高版本的建议是使用DATE
如果您只需要日期部分,并且DATETIME2(n)
当您需要日期和时间时。您应该尝试开始逐步淘汰DATETIME
数据类型(如果可能的话)