Sql 获取毫秒范围内的日期

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

我在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 < [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。请注意日期时间精度错误。此外,
中的范围是独占的。它需要>=并注意日期时间精度错误。此外,
中的范围是独占的。它需要>=和