我想列出最后一个网站的统计数据。 我列出了过去30天;
CONVERT(VARCHAR(10), S.DATEENTERED, 101)
BETWEEN
CONVERT(VARCHAR(10), GETDATE()-30, 101)
AND
CONVERT(VARCHAR(10), GETDATE(), 101)
和本月的;
RIGHT(CONVERT(VARCHAR(10), S.DATEENTERED, 103), 7) =
RIGHT(CONVERT(VARCHAR(10), GETDATE(), 103), 7)
但我不知道上个月使用什么查询。我试过了;
RIGHT(CONVERT(VARCHAR(10), S.DATEENTERED, 103), 7) =
RIGHT(CONVERT(VARCHAR(10), GETDATE()-1, 103), 7)
没用。
答案 0 :(得分:15)
在任何编程语言中使用日期总是令人高兴的,不排除SQL。
回答您的问题以查找上个月发生的所有记录
select S.DATEENTERED
,*
from sometable S
where S.DATEENTERED
between dateadd(mm, datediff(mm, 0, dateadd(MM, -1, getdate())), 0)
and dateadd(ms, -3, dateadd(mm, datediff(mm, 0, dateadd(MM, -1, getdate())) + 1, 0))
order by 1
扩展在特定时间范围内获取记录的最佳方法是利用datediff函数,dateadd函数和where子句中的between条件。
select 'howdy'
,getdate()
where getdate()
between dateadd(mm, 0, 0)
and dateadd(ms, -3, dateadd(mm, datediff(mm, 0, dateadd(mm,-1,getutcdate())) + 1, 0))
上述代码将导致未返回任何记录,因为它正在检查今天的日期是否在1900-01-01 00:00:00.000之间以及上个月的最后一个可能记录日期(最后一天和23:59) :59.997 - SQL Server DATETIME列最多具有3毫秒的分辨率。)
以下代码将返回一条记录,因为我们搜索的日期是一个月前。
select 'howdy'
,dateadd(mm, -1, getdate())
where dateadd(mm, -1, getdate())
between dateadd(mm, 0, 0)
and dateadd(ms, -3, dateadd(mm, datediff(mm, 0, dateadd(mm,-1,getutcdate())) + 1, 0))
分解where子句:
WHERE getdate() -- date to check
between dateadd(mm, 0, 0) -- begin date
and dateadd(ms, -3, dateadd(mm, datediff(mm, 0, dateadd(mm,-1,getutcdate())) + 1, 0)) -- end date
最后,可以通过这种方式确定各种日期,这是一个非常完整的列表:
select dateadd(mm, 0, 0) as BeginningOfTime
,dateadd(dd, datediff(dd, 0, getdate()), 0) as Today
,dateadd(wk, datediff(wk, 0, getdate()), 0) as ThisWeekStart
,dateadd(mm, datediff(mm, 0, getdate()), 0) as ThisMonthStart
,dateadd(qq, datediff(qq, 0, getdate()), 0) as ThisQuarterStart
,dateadd(yy, datediff(yy, 0, getdate()), 0) as ThisYearStart
,dateadd(dd, datediff(dd, 0, getdate()) + 1, 0) as Tomorrow
,dateadd(wk, datediff(wk, 0, getdate()) + 1, 0) as NextWeekStart
,dateadd(mm, datediff(mm, 0, getdate()) + 1, 0) as NextMonthStart
,dateadd(qq, datediff(qq, 0, getdate()) + 1, 0) as NextQuarterStart
,dateadd(yy, datediff(yy, 0, getdate()) + 1, 0) as NextYearStart
,dateadd(ms, -3, dateadd(dd, datediff(dd, 0, getdate()) + 1, 0)) as TodayEnd
,dateadd(ms, -3, dateadd(wk, datediff(wk, 0, getdate()) + 1, 0)) as ThisWeekEnd
,dateadd(ms, -3, dateadd(mm, datediff(mm, 0, getdate()) + 1, 0)) as ThisMonthEnd
,dateadd(ms, -3, dateadd(qq, datediff(qq, 0, getdate()) + 1, 0)) as ThisQuarterEnd
,dateadd(ms, -3, dateadd(yy, datediff(yy, 0, getdate()) + 1, 0)) as ThisYearEnd
使用上面的列表可以确定任何类型的范围。
答案 1 :(得分:11)
以下内容将为您找到上个月的开始:
-- Start of last month
SELECT CAST('01 '+ RIGHT(CONVERT(CHAR(11),DATEADD(MONTH,-1,GETDATE()),113),8) AS datetime)
然后,您将使用以下内容减去本月找到本月的开头。
-- Start of the month
SELECT CAST('01 '+ RIGHT(CONVERT(CHAR(11),GETDATE(),113),8) AS datetime)
当我必须使用SQL Server中的日期时,我经常引用Robyn Page's SQL Server DATE/TIME Workbench。工作台(教程)布局合理,包含了在SQL Server上使用日期时所需的一切。
答案 2 :(得分:6)
这个怎么样?
select DATEADD(month, -1, GETDATE())
答案 3 :(得分:4)
我建议使用上个月的第一天和当月的第一天进行操作,而不是使用BETWEEN使用> =和<。这是我个人的看法,但我相信你会发现这种方法有性能和可维护性的好处。
这是sql。您会注意到我已经包含了上个月值的最后一天,以防您最终采用其他方法。
请注意,这些日期基于当天中午12:00。换句话说,在 6/1/2009和6/30/2009之间获取值将无法满足您的需求,因为排除了所有6/30/2009。如果您使用7月的第一天(2009年7月1日),您将获得保障。
同样,我建议将 BETWEEN 全部避开,如下所示。祝你好运。
Declare @LastMonthFirstDay datetime
Declare @LastMonthLastDay datetime
Declare @ThisMonthFirstDay datetime
Set @LastMonthFirstDay = DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP) - 1, 0);
Set @ThisMonthFirstDay = DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP), 0);
Set @LastMonthLastDay = DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP), 0));
Select * From Table
Where DateEntered >= @LastMonthFirstDay
And DateEntered < @ThisMonthFirstDay;
答案 4 :(得分:2)
尝试使用DATEADD功能。您可以使用MONTH(mm)日期部分添加-1,它应该可以工作。 Here is a link
答案 5 :(得分:1)
where year(S.DATEENTERED) = year(dateadd(mm, -1, getdate())) and month(S.DATEENTERED) = month(dateadd(mm, -1, getdate()))
可能不是表现良好,但你有这个想法。
答案 6 :(得分:0)
尝试:
declare @lastm int
set @lastm = datepart(mm,getdate()) - 1
...
where datepart(mm,s.dateentered) = @lastm
答案 7 :(得分:0)
获得上个月的第一天
SELECT DATEADD(MM, DATEDIFF(MM, '01/01/2000', DATEADD(MM, -1,GETDATE())), '01/01/2000')
上一个月的最后一天
SELECT DATEADD(SS,-1,DATEADD(MM, DATEDIFF(MM,'01/01/2000',GETDATE()),'01/01/2000'))
然后根据此范围进行搜索。