SQL 比较 datetime2 时忽略纳秒
SQL ignore nanoseconds when comparing datetime2
我有 2 个表,每个表都有一个 datetime2
字段。其中一个表也存储了纳秒,而另一个表只存储了毫秒(无法更改此数据)。现在我想比较 2 个表并检查 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
的查询中没有出错
尝试 CAST 到 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 位。另外,请使用探测器 JOINS
:
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
语法,而不是逗号语法。最后请注意,加入日期时间字段并不理想,因此您可能需要考虑在两个表中使用 ID 的方法。
我有 2 个表,每个表都有一个 datetime2
字段。其中一个表也存储了纳秒,而另一个表只存储了毫秒(无法更改此数据)。现在我想比较 2 个表并检查 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
尝试 CAST 到 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 位。另外,请使用探测器 JOINS
:
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
语法,而不是逗号语法。最后请注意,加入日期时间字段并不理想,因此您可能需要考虑在两个表中使用 ID 的方法。