6 sql sql-server sql-server-2005
我想列出最后一个网站的统计数据.我列出了过去30天;
CONVERT(VARCHAR(10), S.DATEENTERED, 101)
BETWEEN
CONVERT(VARCHAR(10), GETDATE()-30, 101)
AND
CONVERT(VARCHAR(10), GETDATE(), 101)
Run Code Online (Sandbox Code Playgroud)
这个月与;
RIGHT(CONVERT(VARCHAR(10), S.DATEENTERED, 103), 7) =
RIGHT(CONVERT(VARCHAR(10), GETDATE(), 103), 7)
Run Code Online (Sandbox Code Playgroud)
但我不知道上个月使用什么查询.我试过了;
RIGHT(CONVERT(VARCHAR(10), S.DATEENTERED, 103), 7) =
RIGHT(CONVERT(VARCHAR(10), GETDATE()-1, 103), 7)
Run Code Online (Sandbox Code Playgroud)
不工作.
ahs*_*ele 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
Run Code Online (Sandbox Code Playgroud)
扩展在特定时间范围内获取记录的最佳方法是利用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))
Run Code Online (Sandbox Code Playgroud)
上面的代码将导致没有返回记录,因为它正在检查今天的日期是否在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))
Run Code Online (Sandbox Code Playgroud)
分解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
Run Code Online (Sandbox Code Playgroud)
最后,可以通过这种方式确定各种日期,这是一个非常完整的列表:
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
Run Code Online (Sandbox Code Playgroud)
使用上面的列表,可以确定任何类型的范围.
Lim*_*ima 11
以下将为您找到上个月的开始:
-- Start of last month
SELECT CAST('01 '+ RIGHT(CONVERT(CHAR(11),DATEADD(MONTH,-1,GETDATE()),113),8) AS datetime)
Run Code Online (Sandbox Code Playgroud)
然后,您将使用以下内容减去一个,找到本月的开头.
-- Start of the month
SELECT CAST('01 '+ RIGHT(CONVERT(CHAR(11),GETDATE(),113),8) AS datetime)
Run Code Online (Sandbox Code Playgroud)
当我必须在SQL Server中使用日期时,我经常引用Robyn Page的SQL Server DATE/TIME Workbench.工作台(教程)布局合理,包含了在SQL Server上使用日期时所需的一切.
我建议使用上个月的第一天和当月的第一天进行操作,而不是使用 BETWEEN 使用 >= 和 <。这是我个人的看法,但我相信您会发现这种方法具有性能和可维护性方面的优势。
这是sql。您会注意到我已经包含了上个月值的最后一天,以防您最终采用另一种方法。
请记住,这些日期基于当天上午 12:00。换句话说,获取6/1/2009 和 6/30/2009之间的值不会得到你想要的,因为 6/30/2009 被排除在外。如果您使用 7 月的第一天 (7/1/2009),您将获得保障。
同样,我建议避免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;
Run Code Online (Sandbox Code Playgroud)