1

查询:

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字段搜索特定日期?

4

5 回答 5

3

只需将其投射到日期并进行比较即可。它在 sql server 2008 和更新版本中可用。

AND CAST(sv_inquiry.closed_dt AS DATE) = '2013-06-17'
于 2013-06-17T12:35:44.673 回答
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 演示

为了克服这不会使用索引的问题,我建议您将datetime列拆分为单独的列:date并且time喜欢sv_inquiry.closed_datesv_inquiry.closed_time

于 2013-06-17T12:17:05.780 回答
1

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

'2013-6-17' 也不是一个安全的选择。它是不受 DATEFORMAT 属性影响的格式之一,但仍受排序规则的影响。

唯一安全的格式是“20130617”,即未分隔的 ISO 8601 格式。

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

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

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

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

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

于 2013-06-17T12:46:04.733 回答
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%'

如果您有时还需要动态检查时间等等。

于 2013-06-17T12:33:15.800 回答
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
于 2013-06-17T12:36:38.417 回答