了解 SQL Server 中的日期时间格式

Hau*_*uri 3 sql-server date-format datetime

我已经处理了很长时间的 MS SQL Server 日期时间类型,但从未想过为什么会发生以下情况:

  1. 我查询一个包含 smalldatetime 列的表。这个 smalldatetime 总是以格式返回yyyy-MM-dd hh:mm:ss
  2. 现在我写了一个不同的查询,我想在 WHERE 子句中应用一个 smalldatetime 过滤器,比如 WHERE TimeStamp >= 'yyyy-MM-dd hh:mm:ss'
  3. SQL Server 检索到错误并告诉我无法将该 nvarchar 转换为有效的 smalldatetime

似乎只有当我更改指定的格式并使用欧洲格式编写它时才有效,例如WHERE TimeStamp >= 'dd-MM-yyyy hh:mm:ss'. 为什么 SQL Server 以一种在应用于自身时不可覆盖或有效的格式向我显示日期?我在编写查询时更改日期格式没有任何问题,但我想在应用程序级别(Java-JDBC 应用程序)使用这些日期,并且我不想一直应用日期格式更改。 .. 谁能解释一下为什么会发生这种情况,以及是否有任何方法可以在数据库级别解决它?谢谢!!

编辑:请参阅下面 Management Studio 中错误的屏幕截图。 在此处输入图片说明

Aar*_*and 13

SQL Server 中唯一真正安全的 DATETIME/SMALLDATETIME 格式是:

yyyyMMdd
yyyyMMdd hh:nn:ss[.mmmmmmm]
yyyy-MM-ddThh:nn:ss[.mmmmmmm]
----------^ yes, that T is important!
Run Code Online (Sandbox Code Playgroud)

其他任何内容都会受到 SQL Server、Windows、提供程序、应用程序代码、最终用户等的错误解释。例如,以下内容总是会中断:*

SET LANGUAGE FRENCH;
SELECT CONVERT(DATETIME, '2013-11-13');
Run Code Online (Sandbox Code Playgroud)

结果:

Le paramètre de langue est passé à Français。
Msg 242, Level 16, State 3, Line 2
La conversion d'un type de données varchar en type de données datetime a créé une valeur hors limites。

只是改变了语言(其中任何用户会话可以做到)强制SQL Server来解释,作为YYYY-DD-MM代替YYYY-MM-DD。类似的事情可能发生在像DATEFORMAT. 但是在使用上述两种格式时,这些设置实际上被忽略了。

始终,始终,始终使用上述两种格式之一。如果您将变量作为字符串传递,请停止这样做。如果不能,请先检查以确保它通过ISDATE()。如果您让人们在表单字段中输入任何日期字符串,也不要这样做。在将字符串传递给 SQL Server 之前,使用日期选择器或日历控件并指定字符串的格式。好吧,根据语言,只需将其保留为日期时间值,根本不要将其转换为字符串。

请阅读这篇文章:

有一个例外:SELECT CONVERT(DATE, 'yyyy-mm-dd');不会断。但是我在一致性方面犯了错误,而不是只在我知道它不会破坏的地方使用一种格式,而不得不在其他地方使用更安全的格式。


Eri*_*ikE 5

根据 SQL Server Books Online Write International Transact-SQL Statements,您可以像这样包装日期字符串:

{ ts 'yyyy-mm-dd hh:mm:ss[.fff] '}
Run Code Online (Sandbox Code Playgroud)

例子:

{ ts '1998-09-24 10:02:20' }
Run Code Online (Sandbox Code Playgroud)

这对您来说可能更容易完成,因为您无需T在中间插入 a ,而只需在开头和结尾连接字符串。

一个警告:使用此语法时,您无法控制精确的类型;结果总是datetime。要获得smalldatetime结果(如问题中所示),您需要使用转换(或强制转换)。在这种情况下,您不妨首先使用convert(使用正确的样式参数)。