获取上个月的第一个和最后一个日期的最简单,最有效的方法是什么?

时间:2012-05-11 11:16:00

标签: sql date sql-server-2000

我正试图获得上个月的第一天和最后一天。我真正需要的是BETWEEN子句的范围,所以我需要第一天的第一秒和最后一天的最后一秒。

这是我一直在使用的代码:

set @startDate = DATEADD(mm, DATEDIFF(mm,0,DATEADD(mm, -1, getdate())), 0)
set @endDate = dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()  ), 0))

然而,就今天而言,这实际上是在2011年4月1日和2011年5月1日返回,这并不完全准确。我想获得endDate的4/30/2011的最后一秒。

我一直在谷歌搜索,我看到许多不同的方式来获得一个月的第一天/最后一天。即使在SO本身,我也会看到这个问题的许多不同变体以及许多不同的答案。我想编译所有方法的列表来实现这一点,然后确定哪个是“最好的”(基于简单性和效率)

(我应该补充说我正在使用sql server 2000)

修改

重新结束错误 - 这段代码实际上是正确的,问题只是@endDate是一个小时间。我将其更改为日期时间,现在可以正常工作

2 个答案:

答案 0 :(得分:4)

对于日期,我强烈建议您不要使用BETWEEN。您需要从日期中移除3毫秒才能获得“前一天的最后一刻”。

对于具有不同精度的连续值(而不是离散值),通常最好使用>= AND <。例如......

WHERE myDateField >= '2012-04-01' AND myDateField < '2012-05-01'

通过这样做,您甚至无需考虑myDateField数据或数据类型的准确性。它只是有效。总是


考虑到这一点,你的代码非常接近我将使用的......

SET @start = DATEADD(month, DATEDIFF(month, 0, getDate()) - 1, 0)
SET @end   = DATEADD(month, DATEDIFF(month, 0, getDate())    , 0)

答案 1 :(得分:0)

编辑:根据@Dems的解释(请参阅评论)

我想现在我的答案与@Dems一样,我们都有相同的答案。 :) @Dems Credit给你。

尝试此查询,它会根据您的需要为您提供正确的日期。

select DATEADD(mm, DATEDIFF(mm,0,DATEADD(mm, -1, GETDATE())), 0)
select DATEADD(mm, DATEDIFF(mm,0,GETDATE()  ), 0)

并使用此日期,您可以根据@Dems的建议直接使用>= and <