0

大家好,我有一张包含多条记录的表格费用。

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'

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

4

2 回答 2

3

您几乎可以肯定使用了错误的数据类型。您的列“work_completed”应该是日期类型。几乎可以肯定是 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 必须对每一行进行两次类型转换。

于 2012-12-06T05:45:12.690 回答
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'
;
于 2012-12-06T05:35:34.083 回答