查询:
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
字段搜索特定日期吗?
答案 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'
为了解决这个不能使用索引的问题,我建议您将datetime
列拆分为单独的列:date
和time
,如sv_inquiry.closed_date
和sv_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