根据年份 - SQL搜索记录时出现问题

时间:2012-12-06 05:10:16

标签: sql sql-server

大家好我有一张有多个记录的桌面费用。

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'

我也通过在查询之间使用来尝试这个但是它不起作用。如果有任何机构有一个想法,请与我分享。

2 个答案:

答案 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'
;