Sql 获取毫秒范围内的日期
我在SQL Server中有这个表Sql 获取毫秒范围内的日期,sql,sql-server,Sql,Sql Server,我在SQL Server中有这个表 [ArticleID] - number [ArticleName] - varchar [Created_dtm] - date [Update_dtm] - date 我希望在更新\u dtm之前的0,1-1,5秒内获得所有创建\u dtm的行 我试过了 Select * from [Article] Where ([Created_dtm] + 0.1 < [Update_dtm]) or ([Created_dtm] + 1.5 < [U
[ArticleID] - number
[ArticleName] - varchar
[Created_dtm] - date
[Update_dtm] - date
我希望在更新\u dtm之前的0,1-1,5秒内获得所有创建\u dtm的行
我试过了
Select *
from [Article]
Where ([Created_dtm] + 0.1 < [Update_dtm]) or ([Created_dtm] + 1.5 < [Update_dtm])
选择*
来自[文章]
其中([Created_dtm]+0.1<[Update_dtm])或([Created_dtm]+1.5<[Update_dtm])
但它不起作用。im丢失您可以使用毫秒完成此操作:
Select *
from [Article]
Where (dateadd(ms, 100, Created_dtm) > [Update_dtm]) and
(dateadd(ms, 1500, Created_dtm) < [Update_dtm])
选择*
来自[文章]
其中(dateadd(ms,100,创建的\u dtm)>[Update\u dtm]),以及
(dateadd(ms,1500,已创建\u dtm)<[Update\u dtm])
或者写出时间段的全名:
Select *
from [Article]
Where dateadd(millisecond, 100, Created_dtm) > [Update_dtm] and
dateadd(millisecond, 1500, Created_dtm) < [Update_dtm]
选择*
来自[文章]
其中dateadd(毫秒,100,已创建)>[Update\u dtm]和
dateadd(毫秒,1500,已创建)<[Update\u dtm]
您可以使用毫秒执行此操作:
Select *
from [Article]
Where (dateadd(ms, 100, Created_dtm) > [Update_dtm]) and
(dateadd(ms, 1500, Created_dtm) < [Update_dtm])
选择*
来自[文章]
其中(dateadd(ms,100,创建的\u dtm)>[Update\u dtm]),以及
(dateadd(ms,1500,已创建\u dtm)<[Update\u dtm])
或者写出时间段的全名:
Select *
from [Article]
Where dateadd(millisecond, 100, Created_dtm) > [Update_dtm] and
dateadd(millisecond, 1500, Created_dtm) < [Update_dtm]
选择*
来自[文章]
其中dateadd(毫秒,100,已创建)>[Update\u dtm]和
dateadd(毫秒,1500,已创建)<[Update\u dtm]
另一个选项
SELECT
*,
SecsDiff = DATEDIFF(ms, td.Created_dtm, td.Update_dtm) / 1000.0
FROM
#TestData td
WHERE
DATEDIFF(ms, td.Created_dtm, td.Update_dtm) BETWEEN 100 AND 1500;
另一个选择
SELECT
*,
SecsDiff = DATEDIFF(ms, td.Created_dtm, td.Update_dtm) / 1000.0
FROM
#TestData td
WHERE
DATEDIFF(ms, td.Created_dtm, td.Update_dtm) BETWEEN 100 AND 1500;
当您使用
datetime
s时,尤其是在毫秒范围内,您必须非常了解datetime
字段的精度。在MS SQL中,datetime
数据类型仅精确到1/300秒。这意味着高精度将导致一些意外的舍入。这也是微软建议使用datetime 2
代替datetime
的主要原因之一
设置
IF OBJECT_ID('tempdb..#times') IS NOT NULL
DROP TABLE #times ;
CREATE TABLE #times ( pickMe varchar(5), Created_dtm datetime, Update_dtm datetime ) ;
INSERT INTO #times ( pickMe, Created_dtm, Update_dtm )
VALUES
( 'YES', '9/6/2017 12:00:00.000' , '9/6/2017 12:00:01.250' ) -- 1.25
, ( 'YES', '9/6/2017 12:00:00.000' , '9/6/2017 12:00:00.100' ) -- 0.1
, ( 'YES', '9/6/2017 12:00:00.000' , '9/6/2017 12:00:01.500' ) -- 1.5
, ( 'NO' , '9/6/2017 12:00:00.000' , '9/6/2017 12:00:00.099' ) -- 0.099
, ( 'NO' , '9/6/2017 12:00:00.000' , '9/6/2017 12:00:01.501' ) -- 1.501
, ( 'NO' , '9/6/2017 12:00:00.000' , '9/6/2017 14:00:00.000' ) -- WAY OUT
, ( 'YES', '9/6/2017 11:59:59.500' , '9/6/2017 12:00:00.000' ) -- 0.5
, ( 'YES', '9/6/2017 11:59:59.900' , '9/6/2017 12:00:00.000' ) -- 0.1
, ( 'YES', '9/6/2017 11:59:58.500' , '9/6/2017 12:00:00.000' ) -- 1.5
, ( 'NO' , '9/6/2017 11:59:59.901' , '9/6/2017 12:00:00.000' ) -- 0.099
, ( 'NO' , '9/6/2017 11:59:58.499' , '9/6/2017 12:00:00.000' ) -- 1.501
, ( 'NO' , '9/6/2017 10:00:00.000' , '9/6/2017 12:00:00.000' ) -- WAY OUT
;
在我的示例中,我选择了许多显示舍入问题的边缘日期。这应该选择在修改的\u dtm
之前0.1秒到1.5秒之间创建了的记录,其中只有6个记录
查询
SELECT
DATEDIFF(millisecond,Created_dtm,Update_dtm) AS diff
, pickMe
, Created_dtm
, Update_dtm
FROM #times
WHERE DATEADD(millisecond, 100, Created_dtm) <= update_dtm
AND DATEADD(millisecond, 1500, Created_dtm) >= Update_dtm
任何带有PickMe的内容都不应包括在内。还要注意,显示的日期是四舍五入的,它们会导致不正确的DATEDIFF()
计算
注意:我讨厌日期。当您使用datetime
s时,尤其是在毫秒范围内,您必须非常了解datetime
字段的精度。在MS SQL中,datetime
数据类型仅精确到1/300秒。这意味着高精度将导致一些意外的舍入。这也是微软建议使用datetime 2
代替datetime
的主要原因之一
设置
IF OBJECT_ID('tempdb..#times') IS NOT NULL
DROP TABLE #times ;
CREATE TABLE #times ( pickMe varchar(5), Created_dtm datetime, Update_dtm datetime ) ;
INSERT INTO #times ( pickMe, Created_dtm, Update_dtm )
VALUES
( 'YES', '9/6/2017 12:00:00.000' , '9/6/2017 12:00:01.250' ) -- 1.25
, ( 'YES', '9/6/2017 12:00:00.000' , '9/6/2017 12:00:00.100' ) -- 0.1
, ( 'YES', '9/6/2017 12:00:00.000' , '9/6/2017 12:00:01.500' ) -- 1.5
, ( 'NO' , '9/6/2017 12:00:00.000' , '9/6/2017 12:00:00.099' ) -- 0.099
, ( 'NO' , '9/6/2017 12:00:00.000' , '9/6/2017 12:00:01.501' ) -- 1.501
, ( 'NO' , '9/6/2017 12:00:00.000' , '9/6/2017 14:00:00.000' ) -- WAY OUT
, ( 'YES', '9/6/2017 11:59:59.500' , '9/6/2017 12:00:00.000' ) -- 0.5
, ( 'YES', '9/6/2017 11:59:59.900' , '9/6/2017 12:00:00.000' ) -- 0.1
, ( 'YES', '9/6/2017 11:59:58.500' , '9/6/2017 12:00:00.000' ) -- 1.5
, ( 'NO' , '9/6/2017 11:59:59.901' , '9/6/2017 12:00:00.000' ) -- 0.099
, ( 'NO' , '9/6/2017 11:59:58.499' , '9/6/2017 12:00:00.000' ) -- 1.501
, ( 'NO' , '9/6/2017 10:00:00.000' , '9/6/2017 12:00:00.000' ) -- WAY OUT
;
在我的示例中,我选择了许多显示舍入问题的边缘日期。这应该选择在修改的\u dtm
之前0.1秒到1.5秒之间创建了的记录,其中只有6个记录
查询
SELECT
DATEDIFF(millisecond,Created_dtm,Update_dtm) AS diff
, pickMe
, Created_dtm
, Update_dtm
FROM #times
WHERE DATEADD(millisecond, 100, Created_dtm) <= update_dtm
AND DATEADD(millisecond, 1500, Created_dtm) >= Update_dtm
任何带有PickMe的内容都不应包括在内。还要注意,显示的日期是四舍五入的,它们会导致不正确的DATEDIFF()
计算
注意:我讨厌日期。如果它们被声明为日期
,这实际上是不可能的。你的意思是它们是DATETIME
?我的错,它们是[DATETIME]非空的,如果你需要那种级别的分辨率,将[Created_dtm]和[Update_dtm]定义为日期数据类型不会解决这个问题。我建议改为使用DATETIME2(4)。谢谢你的输入。日期存储在哪里?你会一直用到毫秒吗?ie日期存储为xx:xx:xx.150或xx:xx:xx.999。如果它们被声明为日期
,这实际上是不可能的。你的意思是它们是DATETIME
?我的错,它们是[DATETIME]非空的,如果你需要那种级别的分辨率,将[Created_dtm]和[Update_dtm]定义为日期数据类型不会解决这个问题。我建议改为使用DATETIME2(4)。谢谢你的输入。日期存储在哪里?你会一直用到毫秒吗?ie日期存储为xx:xx:xx.150或xx:xx:xx.999。请注意日期时间精度错误。此外,
中的范围是独占的。它需要>=并注意日期时间精度错误。此外,
中的范围是独占的。它需要>=和