2

我正在尝试获取上个月的第一天和最后一天。我真正需要的是一个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 日,这并不完全准确。我想获得 2011 年 4 月 30 日的最后一秒作为 endDate。

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

(我应该补充一点,我正在使用 sql server 2000)

编辑:

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

4

2 回答 2

4

对于日期,我强烈建议不要使用BETWEEN. 您需要从日期中删除 3ms 以获得“前一天的最后一刻”,从而突出显示了这一点。

对于可能具有不同准确度的连续值(而不是离散值),通常最好使用>= 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)
于 2012-05-11T11:21:28.447 回答
0

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

I think now my answer will be same as @Dems to we both are have same answers. :) @Dems Credit goes to you.

try this query it will get you the proper dates as per your need.

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

and using this date you can directly use the >= and < as per the suggestion by @Dems below.

于 2012-05-11T11:21:33.803 回答