SQL BETWEEN运算符

时间:2010-10-29 20:17:36

标签: sql sql-server sql-server-2005 tsql

为什么我会收到'2009'数据?我在WHERE条款中做错了什么?

SELECT CONVERT(varchar, EventDate, 101) AS EVENTDATE, 
       CONVERT(varchar, ClosedDate, 101) AS CLOSEDDATED, 
       DATEDIFF(Day,EventDate,ClosedDate) AS DiffDate,
  FROM mytable
 WHERE (CONVERT(varchar, EventDate, 101) BETWEEN '04/01/2010' AND '04/30/2010') 

4 个答案:

答案 0 :(得分:11)

你正在进行字符串比较,从左到右。 '04 / 10/2009'介于'04 / 0'和'04 / 3'之间。

如果您要比较的字段是DATETIME,请不要尝试转换它。 SQL服务器可以将字符串转换为日期并正确进行比较。

答案 1 :(得分:5)

如果使用支持的日期格式,SQL Server将隐式将字符串转换为DATETIME:

SELECT CONVERT(varchar, EventDate, 101) AS EVENTDATE, 
       CONVERT(varchar, ClosedDate, 101) AS CLOSEDDATED, 
       DATEDIFF(Day,EventDate,ClosedDate) AS DiffDate,
  FROM mytable
 WHERE EventDate BETWEEN '2010-04-01' AND '2010-04-30' 

您的查询只是进行字符串比较,与日期跨度无关。

答案 2 :(得分:0)

您的WHERE子句可能正在进行字符串比较而不是日期比较。如果您想进行日期比较,可以更改

CONVERT(varchar, EventDate, 101)

CAST (CONVERT(varchar, EventDate, 101) AS DATETIME)

答案 3 :(得分:0)

你真的不需要所有转换。日历中的日期将具有正确的开始和结束时间。您还希望考虑可能超过结束日期或在日期之前开始并在日期范围内结束的事件。或者最后开始并过去......

以下是我们使用的一些代码

    (EventStartDtTm >= startDt and EventStartDtTm <= endDt) 
 || (EventStartDtTm <= startDt and EventEndDtTm >= startDt)

- 帕特里克

相关问题