我正试图获得上个月的第一天和最后一天。我真正需要的是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
是一个小时间。我将其更改为日期时间,现在可以正常工作
答案 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 <
。