比较datetime2时SQL忽略纳秒

比较datetime2时SQL忽略纳秒,sql,sql-server,datetime2,Sql,Sql Server,Datetime2,我有两个表,每个表都有一个datetime2字段。其中一个表也存储了纳秒,而另一个表最多只存储毫秒(无法更改此数据)。现在我想比较这两个表并检查datetime2值是否匹配,但我必须忽略纳秒 样本数据: Table1 Table2 2018-01-24 10:51:23.9976180 2018-01-24 10:51:23.9970000 2018-01-24 10:51:23.9976180 2018-01-24 10:51:23

我有两个表,每个表都有一个
datetime2
字段。其中一个表也存储了纳秒,而另一个表最多只存储毫秒(无法更改此数据)。现在我想比较这两个表并检查
datetime2
值是否匹配,但我必须忽略纳秒

样本数据:

Table1                         Table2

2018-01-24 10:51:23.9976180    2018-01-24 10:51:23.9970000
2018-01-24 10:51:23.9976180    2018-01-24 10:51:23.9970000
2018-01-24 11:08:23.2578500    2018-01-24 11:08:23.2570000
我的查询当前如下所示:

select t1.* from Table1 t1, Table12 t2 where t1.tradeDateTime = t2.tradeDate
你可以猜到,我没有得到这些例子的任何结果,因为纳秒不同

所以我的问题是,我怎么能忽略
where
-子句中的纳秒呢

编辑:

我知道我应该使用适当的
JOIN
s。这个查询只是为了测试我是否在使用
JOIN

的查询中没有错误,请尝试转换为DATETIME

select t1.* from Table1 t1, Table12 t2 
where CAST(t1.tradeDateTime as DATETIME) = CAST(t2.tradeDate as DATETIME)
测验

DECLARE @1 DATETIME2='2018-01-24 10:51:23.9976180'
, @2 DATETIME2 = '2018-01-24 10:51:23.9970000'


SELECT @1, @2,  Test =CASE WHEN CAST(@1 AS DATETIME) = CAST(@2 AS
DATETIME) THEN 1 ELSE 0 END

这完全取决于您希望使用的精度。您想只匹配日期部分还是不带毫秒的日期和时间

以下是更改数据精度的几种方法:

CREATE TABLE #dates ( val DATETIME2 );

INSERT INTO #dates ( val ) VALUES ( SYSDATETIME());   
INSERT INTO #dates ( val ) VALUES ( SYSDATETIME());    
INSERT INTO #dates ( val ) VALUES ( SYSDATETIME());

SELECT d.val AsOriginalValue ,
       CAST(d.val AS DATETIME) AsDateTime ,
       CAST(d.val AS DATETIME2(0)) AsDateTime2_0 ,
       CAST(d.val AS DATE) AsDate
FROM   #dates AS d;

DROP TABLE #dates;
结果:

AsOriginalValue             AsDateTime              AsDateTime2_0             AsDate
--------------------------- ----------------------- ---------------------- ----------
2018-01-25 14:35:14.3660549 2018-01-25 14:35:14.367 2018-01-25 14:35:14    2018-01-25
2018-01-25 14:35:14.3665552 2018-01-25 14:35:14.367 2018-01-25 14:35:14    2018-01-25
2018-01-25 14:35:14.3670555 2018-01-25 14:35:14.367 2018-01-25 14:35:14    2018-01-25

注意:注意四舍五入。

将日期转换为
DateTime
,因为这将仅将值转换为小数点后3位。此外,请使用prober
连接

SELECT t1.*
FROM Table1 t1
    JOIN Table12 t2 ON t2.Joinable_ID = t1.Joinable_ID
WHERE CAST(t1.tradeDateTime AS DATETIME) = CAST(t2.tradeDate AS DATETIME)

使用
WHERE
子句中的函数可能会导致性能问题。通过CTE方法,您可能会获得更好的速度:

 with t1 as 
           (select cast(tradeDateTime as datetime) as tradeDateTimeNoTime
            from Table1)
    , t2 as 
           (select cast(tradeDate as datetime) as tradeDateNoTime 
            from Table2)

 select t1.*
      , t2.* 
 from t1 
 inner join t2 
 on t1.tradeDateTimeNoTime = t2.tradeDateNoTime

无论您使用哪种解决方案,我都绝对建议使用显式
JOIN
语法,而不是逗号语法。最后要注意的是,开始一个DATE时间字段并不理想,所以你可能想考虑一种在两个表中使用IDS的方法。

这是一个很好的博客帖子,说明你为什么应该避免。