Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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会将确切的日期时间更改一个刻度_Sql_Sql Server - Fatal编程技术网

为什么SQL会将确切的日期时间更改一个刻度

为什么SQL会将确切的日期时间更改一个刻度,sql,sql-server,Sql,Sql Server,为什么我会得到这样的结果: 2014-12-01 00:00:00.000 我想为选择条件使用变量: DECLARE @dateEnd datetime SET @dateEnd = '2014-11-30T23:59:59.999' SELECT @dateEnd 这是另一个相关的问题。我希望将第一个数据点(dataStart)包括在内,并将第二个数据点(dataEnd)从所选数据范围中排除。怎么做 日期时间的时间范围为'00:00:00至23:59:59.997'。在“.999”处,此值向

为什么我会得到这样的结果:
2014-12-01 00:00:00.000

我想为选择条件使用变量:

DECLARE @dateEnd datetime
SET @dateEnd = '2014-11-30T23:59:59.999'
SELECT @dateEnd

这是另一个相关的问题。我希望将第一个数据点(dataStart)包括在内,并将第二个数据点(dataEnd)从所选数据范围中排除。怎么做

日期时间的时间范围为'00:00:00至23:59:59.997'。在“.999”处,此值向上舍入到最接近的第二秒,这恰好是第二天的开始,导致出现所述结果。不过为了记录在案,“.998”将保留当天“23:59:59”的时间部分


Sql Server日期时间数据类型的精度

为了详细说明shree.pat的答案,Sql Server的分辨率为每1秒300个“步骤”或量子,或者分辨率间隔为~3ms

这意味着使用
DATETIME
无法精确表示1毫秒精度的时间瞬间。在这里的示例中,
2014-11-30T23:59:59.999
将被四舍五入为
2014-12-01 00:00:00.000
。同样,1毫秒之前,
2014-11-30T23:59:59.998
将四舍五入为
2014-11-30T23:59:59.997

此查询演示了与实际时间相比,
DateTime
如何舍入毫秒:

where [MyDate] between @dateStart and @dateEnd
如果您需要1毫秒或更高的精度,那么应该使用数据类型,它可以表示精度低至
100ns

比较日期范围与之间的问题

根据Damien的评论,您的问题说明了为什么使用
BETWEEN
搜索两个日期之间的数据不是一个好主意

查询的准确性取决于日期类型,因为@dateStart和@dateEnd之间的[MyDate]现在会给出不同的结果,这取决于
@dtStart
@dtEnd
以及您要比较的日期和时间列

相反,在下限(包括)上使用
=
,在排除的上限上使用
=@dateStart和[MyDate]<@dateEnd;

哪个数据库管理系统?(当然不是ANSI/ISO SQL标准。)SQL Server日期时间只有每秒。如果需要更高的分辨率,请切换数据类型。@shree.pat18。你的答案基本上是正确的,你应该取消删除它。文档中说值是“四舍五入”的,所以23:59:59.998可能不会“四舍五入”,但23:59:59.999会四舍五入。如果不能更改数据类型,请更改WHERE条件-WHERE MyDate>=@dateStart和MyDate=

WITH cteMS AS
(
    SELECT TOP 1000 ROW_NUMBER() OVER (ORDER BY o1.object_id) as MilliSeconds
    FROM sys.objects o1 CROSS JOIN sys.objects o2
)
SELECT DATEADD(ms, cteMS.MilliSeconds, CAST('2015-01-01' AS DATETIME2)) AS DT2, 
       DATEADD(ms, cteMS.MilliSeconds, CAST('2015-01-01' AS DATETIME)) AS DT
FROM cteMS;
DECLARE @dateEnd AS DateTime, or DateTime2
SET @dateEnd = '2014-11-31';
SELECT ... WHERE [MyDate] >= @dateStart AND [MyDate] < @dateEnd;