sql-server – SQL Server如何将日期与字符串文字进行比较?

前端之家收集整理的这篇文章主要介绍了sql-server – SQL Server如何将日期与字符串文字进行比较?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在修改一个查询,这是我的脚本:
select 
CASE When EndDate='1/1/1900' 
THEN NULL 
ELSE EndDate END,*
from Members

此脚本只是比较日期,如果是’1/1/1900’则返回null,否则返回日期.

我可以在我的数据库中看到日期存储的格式如下:

1900-01-01 00:00:00.000

问题是当我的模式与存储的模式不同时,sql Server如何匹配日期.同样在日期格式中,我没有传递时间元素.

解决方法

sql Server将您传递的字符串文字(‘1/1/1900’)转换为 data type precedence (since datetime has higher precedence than string types)的日期时间值.如果您将无效日期作为字符串传递,例如’2/31/1900′,您将收到转换错误(Msg 242),因为sql Server不知道2月31日的含义.它不是试图匹配一个看起来像你传递的字符串,它将两者都转换为日期的内部表示(更多关于我的评论).

特别是在处理日期时,不要考虑格式,除了当你传递字符串文字时,m / d / y(或者是d / m / y?)是一种可怕的格式.更安全使用:

YYYYMMDD

您的查询应为:

SELECT CASE When EndDate = '19000101' 
 THEN NULL ELSE EndDate END,...other columns...
FROM dbo.Members;

这样,当您通过9月8日这样的日期时,它不会被sql Server,其他读者等误解.是09/08/2013 9月8日还是8月9日?取决于你所在的世界的哪个部分,对吗?在你的情况下它是可以的,因为日期和月份是相同的,但情况并非总是如此.请参阅以下文章

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx

(请,请完整阅读该链接.)

最后,如果您正在使用DATETIME / SMALLDATETIME并且正在查找特定日期的值,则不应该使用相等,而是使用范围查询.例如,要查找2013年4月15日EndDate所有行,无论何时,您都会说:

WHERE EndDate >= '20130415'
  AND EndDate <  '20130416'

(Read this link to understand why you don’t want to use BETWEEN here.)

如果您使用的是sql Server 2008或更高版本,您仍然可以使用CONVERT在此列上实现sargability,但这是一个罕见的例外 – 通常您不希望对列使用函数.

WHERE CONVERT(DATE,EndDate) = '20130415'

其他一些评论 – 与您的问题没有直接关系,但有关您的代码的外围观察:

> Always use the schema prefix
> Never use SELECT * in production

原文链接:https://www.f2er.com/mssql/77958.html

猜你在找的MsSQL相关文章