Hau*_*uri 3 sql-server date-format datetime
我已经处理了很长时间的 MS SQL Server 日期时间类型,但从未想过为什么会发生以下情况:
yyyy-MM-dd hh:mm:ss
WHERE TimeStamp >= 'yyyy-MM-dd hh:mm:ss'
似乎只有当我更改指定的格式并使用欧洲格式编写它时才有效,例如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');
不会断。但是我在一致性方面犯了错误,而不是只在我知道它不会破坏的地方使用一种格式,而不得不在其他地方使用更安全的格式。
根据 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(使用正确的样式参数)。
归档时间: |
|
查看次数: |
53086 次 |
最近记录: |