MSSQL查询不返回任何结果

时间:2013-06-17 12:15:51

标签: sql sql-server

查询:

SELECT sv_inquiry.inquiry_id, sv_inquiry.owner_rep, sv_inquiry.status
      ,sv_inquiry.owner_rep, sv_inquiry.closed_dt 
FROM sv_inquiry 
WHERE sv_inquiry.typ = 'incident' 
     AND sv_inquiry.status = 'resolved' 
     AND sv_inquiry.owner_grp = 'service center NL & INT' 
     AND sv_inquiry.closed_dt LIKE '%17-6-2013%' 
ORDER BY sv_inquiry.inquiry_id DESC

问题:

此查询返回一个空的结果集,除非我省略“AND sv_inquiry.closed_dt LIKE '%17-6-2013%'”,但如果我把它留下来,我会得到过去几年的所有结果,我只需要得到特定日期的结果

sv_inquiry.closed_dt is a field of the DATETIME type

我应该实现CAST或CONVERT的使用,虽然我不知道如何调整查询以包含它并仅显示特定日期的结果。

(该查询在PHP网站上使用SQLSRV_QUERY语句)

任何人都可以为我调整查询,以便我可以使用sv_inquiry.closed_dt字段搜索特定日期吗?

5 个答案:

答案 0 :(得分:3)

将它投射到最新并进行比较。它在sql server 2008及更新版本中可用。

AND CAST(sv_inquiry.closed_dt AS DATE) = '2013-06-17'

答案 1 :(得分:1)

替换

AND sv_inquiry.closed_dt LIKE '%17-6-2013%'

AND DATEADD(dd, 0, DATEDIFF(dd, 0, sv_inquiry.closed_dt)) = '2013-06-17'

SQLFiddle demo

为了解决这个不能使用索引的问题,我建议您将datetime列拆分为单独的列:datetime,如sv_inquiry.closed_datesv_inquiry.closed_time

答案 2 :(得分:1)

您正尝试将日期时间值与字符串文字进行比较。为此,SQL Server必须使用列的排序规则将datetime值转换为字符串,或者将字符串转换为日期时间(如果它可以确定其格式)。 '17 -6-2013'不是可识别的格式,因此SQL Server在比较之前将dt_closed值转换为字符串。

'2013-6-17'也不是一个安全的选择。 one of the formats不受DATEFORMAT属性的影响,但仍受排序规则的影响。

唯一安全的格式是'20130617',未分离的ISO 8601格式。

您可以使用参数化SQL语句绕过整个转换问题,并将过滤器值作为日期参数传递。

另一个问题是将任何类型的函数应用于列dt_closed将导致查询优化器忽略在dt_closed上定义的任何索引并强制进行表扫描。

更好的解决方案是使用BETWEEN将等操作转换为范围查询,例如

AND sv_inquiry.closed_time between '20130617' AND '20130618'

这将避免转换为字符串并利用任何基础索引

答案 3 :(得分:0)

替换

AND sv_inquiry.closed_dt LIKE '%17-6-2013%'

AND convert(varchar(10),sv_inquiry.closed_dt, 121) = '2013-06-17'

这将使用121格式将您的日期时间转换为varchar。由于长度限制为10个字符,它只会返回日期部分。

另外,您可以使用

AND convert(varchar(100),sv_inquiry.closed_dt, 121) like '2013-06-17%'

如果您有时需要动态检查小时数等等。

答案 4 :(得分:0)

 SELECT sv_inquiry.inquiry_id, sv_inquiry.owner_rep, sv_inquiry.status
  ,sv_inquiry.owner_rep, sv_inquiry.closed_dt 
 FROM sv_inquiry 
  WHERE sv_inquiry.typ = 'incident' 
 AND sv_inquiry.status = 'resolved' 
 AND sv_inquiry.owner_grp = 'service center NL & INT' 
 AND sv_inquiry.closed_dt ='2013-6-17'
 order BY sv_inquiry.inquiry_id DESC