Sql server SQL Server:获取两个日期之间的记录?

Sql server SQL Server:获取两个日期之间的记录?,sql-server,datetime,date-range,Sql Server,Datetime,Date Range,在SQL中,我编写了一个SELECT语句来获取两个日期之间的数据,使用between和 例: 但返回的行仅适用于第26行,而不是第26行和第27行 你能帮我吗?谢谢。您需要更加明确,并添加开始和结束时间,精确到毫秒: select * from xxx where dates between '2012-10-26 00:00:00.000' and '2012-10-27 23:59:59.997' 数据库可以很好地将“2012-10-27”解释为“2012-10-27 00:00:00

在SQL中,我编写了一个SELECT语句来获取两个日期之间的数据,使用between和

例:

但返回的行仅适用于第26行,而不是第26行和第27行


你能帮我吗?谢谢。

您需要更加明确,并添加开始和结束时间,精确到毫秒:

select * 
from xxx 
where dates between '2012-10-26 00:00:00.000' and '2012-10-27 23:59:59.997'
数据库可以很好地将“2012-10-27”解释为“2012-10-27 00:00:00.000”。

试试这个:

select * 
from xxx 
where dates >= '2012-10-26 00:00:00.000' and dates <= '2012-10-27 23:59:59.997'

正如其他人所回答的,您可能有一个DATETIME或其他变体列,而不是日期数据类型

以下是适用于所有人的条件,包括日期:


关于这一点,他在博客中写道:

写这篇文章的明确方式是,将第二个日期增加1,并使其尝试使用以下查询

select * 
from xxx 
where convert(date,dates) >= '2012-10-26' and convert(date,dates) <= '2012-10-27'

您的问题并没有询问如何正确使用BETWEEN,而是询问如何帮助您处理意外截断的结果

正如其他答案中提到/暗示的那样,问题在于除了日期之外,你还有时间段

根据我的经验,使用date diff对键盘的额外磨损是值得的。它能让你准确地表达你想要的东西,你就被覆盖了

select * 
from xxx 
where datediff(d, '2012-10-26', dates) >=0
and  datediff(d, dates,'2012-10-27') >=0
使用datediff,如果第一个日期早于第二个日期,则会得到一个正数。有几种方法可以写上面的内容,例如总是先有字段,然后是常量。只需打开接线员。这是个人喜好的问题

通过删除一个或两个等号,可以明确表示是否要包含或排除端点

在您的情况下,BETWEEN将起作用,因为端点都假定为午夜。 如果端点也是DATETIME,那么使用BETWEEN可能需要更多的强制转换。
在我看来,DATEDIFF被放在我们的生活中是为了让我们远离这些问题

实际上,对于DATETIME列,您需要指定..23:59:59.997,因为DATETIME具有3ms的分辨率精度。对于DATETIME2,您的解决方案确实可以很好地工作。如果有足够的眼球,所有问题都会变得肤浅…:-@马克,你的意思是相反的吗?它不适用于DATETIME2。请参见选择演员“20120101 12:34:56.999999”作为datetime2@RichardTheKiwi:是的-奥德最初有。。。23:59:59.999哪个适用于DATETIME2而不适用于DATETIME2取决于您使用的SQL Server版本,以及日期列的数据类型….另外:当您使用时-我建议使用安全的日期/时间格式-该格式适用于所有SQL Server版本,并且与任何日期、区域或语言设置无关。这可能是20121017 23:59:59.997 YYYYMMDD,并且日期没有破折号!-或者2012-10-17T23:59:59.997日期中的破折号,以及固定的T作为日期和时间部分之间的分隔符我认为此链接有助于解决问题:它不会选择日期为2012-10-27 23:59:59.003到2012-10-27 23:59:59.997的行-该日期范围内也可能有一些!到Aaron Bertrand博客的链接非常有用,因为它解释了为什么在datetime列上使用中间查询时会出现问题。我很久以前就学会了总是说“2016年1月1日00:00:00”和2016年1月31日23:59:59”之间,而不是“2016年1月1日”和2016年1月31日之间”,但我从来没有花时间去探究原因。@Jamestomey是的,这篇博文很特别。您意识到,如果列的类型允许毫秒,那么BETWEEN将失败,我希望您在日期/日期时间文本中没有真正使用m/d/yyyy格式@打字立方ᵀᴹ, 我可能即将暴露我的无知,但我总是很欣赏学习一些新的东西,m/d/yyyy查询有什么危险?我喜欢yyyy/mm/dd作为屏幕输出,因为如果用户复制/粘贴到文本文件,它会按字母顺序排序,但我怀疑您说的更多的是从查询返回不准确数据的风险……正确,当用于输出时,不要紧,以用户喜欢的格式输出。但对于输入,例如插入,查询/过程中的参数存在某些问题。我有一些答案是关于模棱两可格式的问题,但我会让你参考Aaron的另一篇帖子:谢谢链接!关于m/d/yyyy与d/m/yyyy的比较有很好的观点。作为美国人,我已经习惯了m/d,但它从来就没有多大意义,是不是应该从小到大?Scott Hanselman提到在9月11日讨论9/11,他的德国朋友认为他指的是柏林墙倒塌时的9/11:
select * 
from xxx 
where dates >= '20121026'
  and dates <  '20121028'
select * 
from xxx 
where CAST(dates as DATE) between '20121026' and '20121027'
select * 
from xxx 
where convert(date,dates) >= '2012-10-26' and convert(date,dates) <= '2012-10-27'
select * 
from xxx 
where datediff(d, '2012-10-26', dates) >=0
and  datediff(d, dates,'2012-10-27') >=0