在SQL Server中在地板上执行数学运算的最佳方法是什么?

时间:2009-03-25 17:38:54

标签: sql-server tsql date

这与Floor a date in SQL server有关,但我更进一步:

我在SQL Server表上编写查询,我想获取当前日历年和上一个日历年的所有记录。所以,现在,我想要一个查询返回2008年1月1日到今天之间的所有记录。但是到了2010年1月1日,我希望它能够返回不超过2009年的记录。

基本上,我想将当前日期置于年初,然后减去1。

在浏览了一些SQL Server文档之后,我想出了这个:

   WHERE create_date >= CAST((CAST(YEAR(GETDATE()) AS int) -1) AS varchar)

但感觉有点难看。还有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

为什么不在create_date上使用year函数呢?

WHERE YEAR(create_date) >= (YEAR(GETDATE()) -1)

这假设(正如您所做)数据库中没有比今天的日期更多的记录

答案 1 :(得分:0)

我建议使用日期lastyear-01-01分配一个变量,或者为它做一个UDF,或类似

DECLARE @startOfLastYear DATETIME
SET @startOfLastYear = CAST(YEAR(GETDATE()) - 1 AS VARCHAR) + '-01-01'   

然后执行查询:

WHERE  create_date >= @startOfLastYear

由于两个原因:

  1. 使用YEAR()或任何其他功能 来自表格的数据(即 YEAR(create_date))制作索引 无法使用和减少 查询的表现
  2. 变量名称确切地说明了它是什么,并且更容易阅读代码。