1

我想限制报告从日期 A 到日期 B 返回记录。这就是我一直在做的事情:

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008'
set @endDate = '04/01/2008'
-- test what are the start and end dates
select min(date),max(date) from view_Inspections 
where date between @startDate and @endDate

... 我被告知从 1 月 1 日上午 12 点到 3 月 31 日晚上 11:59 之间返回的记录(当没有指示时间时,午夜是默认值)。但我注意到一个差异,即如果记录的时间为 00:00:00,它将成为该集合的一部分。

是否有更准确的方法来执行此操作,以便准确返回我想要的日期范围?*

我尝试使用时间:

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008 00:00:00'
set @endDate = '04/01/2008 11:59:59'
-- test what are the start and end dates
select min(date),max(date) from view_Inspections 
where date between @startDate and @endDate

...但我注意到一些奇怪的事情:SQL Server 将把百分之一秒提高一半。因此,如果我使用晚于 11:59:29 的任何时间,我就会得到 4 月 1 日的记录(哈哈!愚人节的记录!grr)。这是为什么?

  • (我确信有。我是新手。感谢您的帮助!)
4

5 回答 5

5

总是有简单的选择:

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008'
set @endDate = '04/01/2008'

-- test what are the start and end dates
select min(date),max(date) from view_Inspections 
where date >= @startDate 
and   date < @endDate
于 2009-01-05T19:53:16.007 回答
2

我怀疑 view_Inspections 中的日期列是 SmallDateTime 数据类型。此数据类型的精度为 1 分钟,这可以解释您的意外结果(将秒数四舍五入到最接近的分钟数)。

Roland Shaw 建议的方法是修改查询以适应您的要求的最佳方式。

于 2009-01-05T20:14:29.850 回答
1

BETWEEN 运算符具有包容性,这就是您在第一个查询中看到结果的原因。您在第二个查询中看到的舍入将取决于您在表中使用的确切日期时间数据类型。(顺便说一句,我认为您将秒数与百分之一秒混淆了)。看起来您可能在表中使用了 smalldatetime,在这种情况下,时间会四舍五入到最接近的分钟。

如果您的表使用日期时间,请尝试将您的 @startDate 和 @endDate 显式转换为 DATETIME 值 (CAST(@endDate AS DATETIME))。

快速说明...即使对于 DATETIME 值,SQL Server 也只能精确到 3/100 秒,因此 11:59:59.999 将四舍五入到 12:00:00.000。

你基本上有三个选择:

1) 在 CAST('01/01/2008 00:00:00.000' AS DATETIME) 和 CAST('03/31/2008 12:59:59.997' AS DATETIME) 之间

2) YEAR(my_date) = 2008 AND MONTH(my_date) BETWEEN 1 和 3

3) my_date >= CAST('01/01/2008 00:00:00.000' AS DATETIME) AND my_date < CAST('04/01/2008 00:00:00.000' AS DATETIME)

第一种方法不是很直观,在我看来很容易出错。第二种方法会降低性能,因为无法使用索引,如果您可以进行跨越数年的搜索或在几个月的中间开始/结束,它会变得更加复杂。Rowland 建议的第三种方法是我认为最好的方法。

于 2009-01-05T20:25:30.950 回答
1

只需尝试从日期字段中删除时间,如下所示:

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008'
set @endDate = '04/01/2008'

SELECT min(date),max(date) FROM view_Inspections 
WHERE CAST(FLOOR(CAST(date AS FLOAT)) AS DATETIME) BETWEEN CAST(@startDate AS DATETIME) And CAST(@startDate AS DATETIME))

这会将所有内容从01/01/2008 00:00:00to返回04/01/2008 11:59:59.999。如果您不想04/01包括在内,请将结束日期更改为03/31/2008

于 2010-11-01T20:48:11.180 回答
0

您最好的解决方案是创建一个名为“julian”的 BIGINT(10) 字段,并将其存储在 YYYYMMDD 中。

然后查询 where julian >= '20120103' AND julian <= '20120203'

于 2013-04-03T19:25:41.143 回答