Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql GETDATE上个月_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql GETDATE上个月

Sql GETDATE上个月,sql,sql-server,sql-server-2005,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) 而这个月, RIGHT(CONVERT(VARCHAR(10), S.DATEENTERED, 103), 7) = RIGHT(CONVERT(V

我试图列出一个网站的统计数据。 我列出了最近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) 

不起作用。

尝试使用DATEADD函数。您可以添加一个带有月(mm)日期部分的-1,它应该可以工作

就性能而言,可能不是很好,但您已经有了想法。

试试:

declare @lastm int
set @lastm = datepart(mm,getdate()) - 1


上个月的第一天

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')) 
得到上个月的最后一天

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')) 

然后根据这个范围进行搜索。

在任何编程语言中,使用日期都是一种乐趣,不排除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

使用上面的列表可以确定任何类型的范围。

我建议使用上个月的第一天和本月的第一天进行操作,而不是在use>=和=@LastMonthFirstDay之间使用 并输入日期<@本月第一天;
以下内容将显示上个月的开始:

-- Start of last month 
SELECT CAST('01 '+ RIGHT(CONVERT(CHAR(11),DATEADD(MONTH,-1,GETDATE()),113),8) AS datetime)
然后,您将使用下面的减号1找到本月初

-- Start of the month 
SELECT CAST('01 '+ RIGHT(CONVERT(CHAR(11),GETDATE(),113),8) AS datetime) 
当我必须在SQLServer中处理日期时,我经常引用。工作台(教程)布局良好,包含了我在SQL Server上处理日期时所需的所有内容。

这个怎么样

select DATEADD(month, -1, GETDATE())

“SQL Server DATETIME列的分辨率最多为3毫秒”是一个鲜为人知的事实。我以前只听说过一次这种宝石。非常详细。我认为您将边界日期分配给变量的方法肯定更易于维护。然而,我的印象是,与>==with<对我来说表现更好,但我不能说总是这样。在这种情况下,中间可能是最好的。我很高兴在这篇文章中看到各种各样的选择+1用于最短的查询
select DATEADD(month, -1, GETDATE())