大家好我有一张有多个记录的桌面费用。
expenseID ratename description workcompleted
51699 Base Rate SNL Financial inquiry 08/09/2011
51699 Base Rate SNL Financial inquiry 08/19/2011
51699 Base Rate SNL Financial inquiry 08/09/2012
51699 Base Rate SNL Financial inquiry 08/19/2012
但是当我仅在2012年搜索记录但是它返回了年度(2011年,2012年)的记录。但是我需要我的记录来年,即。
预期结果:
51699 Base Rate SNL Financial inquiry 08/09/2012
51699 Base Rate SNL Financial inquiry 08/19/2012
请参阅我的问题:
select expenseid,ratename,description,workcompleted from EXPENSES
where workcompleted >= '08/08/2012' and workcompleted <= '08/19/2012'
我也通过在查询之间使用来尝试这个但是它不起作用。如果有任何机构有一个想法,请与我分享。
答案 0 :(得分:3)
您几乎肯定使用了错误的数据类型。您的“work_completed”列应为date类型。它几乎肯定是char或varchar。您最好的办法是更改数据类型。
如果您不能这样做,您可以创建一个镜像表的视图,但将“work_completed”列转换为日期类型。查询此类视图的日期范围应该可以正常工作。
如果无法创建视图,则可以更改WHERE子句以进行强制转换。在标准SQL中,它看起来像
WHERE CAST(workcompleted AS DATE) >= '2012-08-08'
AND CAST(workcompleted AS DATE) <= '2012-08-19'
我知道SQL Server支持CAST(),但您可能必须使用原始格式的日期(例如'08 / 08/2012')。
如果你这样做,预计性能会受到影响。 SQL Server必须在每一行上进行两次类型转换。
答案 1 :(得分:2)
请看一下这个。您的查询正在产生您需要的结果。可能还有其他你需要的东西,比如@ paulsm4问的那个?
参考* SQLFIDDLE
你的查询:
select id,name,des,
wkdate from EXPENSES
where wkdate >= '2012-08-08'
and wkdate <= '2012-08-19'
;
结果
ID NAME DES WKDATE
51699 Base Rate SNL Financial inquiry August, 09 2012 00:00:00+0000
51699 Base Rate SNL Financial inquiry August, 19 2012 00:00:00+0000
上面的示例是在 MYSQL 中构建的。另一种按年份获取记录的简单方法,您可以简单地使用类似以下的查询...现在这是在 SQL Server
select id,name,des,
wkdate from EXPENSES
where YEAR(wkdate) = '2012'
;
您可以查看此MSDN ARTICLE ABOUT YEAR IN SQL SERVER TSQL
**基于OP的评论** 在任何情况下,如果您的日期列是nvarchar .....我们将其转换/转换为日期
select id,name,des,
wkdate from EXPENSES
where YEAR(CAST(wkdate AS Date)) = '2012'
;