Tsql 将DateTimeOffset强制转换为DateTime并将结果与DateTime进行比较

Tsql 将DateTimeOffset强制转换为DateTime并将结果与DateTime进行比较,tsql,datetime,datetimeoffset,Tsql,Datetime,Datetimeoffset,有时,将DateTimeOffset转换为Datetime似乎会将DateTimeOffset字段恢复为UTC 我想查找在特定日期之间发生的所有订单。OrderDateTime存储为DateTimeOffset DECLARE @StartDate DATETIME = '20130723' ,@EndDate DATETIME = '20130724' SELECT cn.orderdatetime, LocalTime = CAST(orderdatetim

有时,将DateTimeOffset转换为Datetime似乎会将DateTimeOffset字段恢复为UTC

我想查找在特定日期之间发生的所有订单。OrderDateTime存储为DateTimeOffset

DECLARE @StartDate DATETIME = '20130723'
       ,@EndDate   DATETIME = '20130724'

SELECT cn.orderdatetime,
       LocalTime = CAST(orderdatetime AS datetime),
       facilityid
FROM ConsignmentNote cn
WHERE CAST(OrderDateTime AS DATETIME) BETWEEN @StartDate AND @EndDate
此查询的结果是(如您所料)

但是我还需要在facilityID上过滤此结果集-但是如果我将facilityID添加到查询中:

DECLARE @StartDate DATETIME = '20130723'
       ,@EndDate   DATETIME = '20130724'

SELECT cn.orderdatetime,
       LocalTime = CAST(orderdatetime AS datetime),
       facilityid
FROM ConsignmentNote cn
WHERE CAST(OrderDateTime AS DATETIME) BETWEEN @StartDate AND @EndDate
AND FacilityId = 84
我得到以下结果

orderdatetime                       LocalTime               facilityid
2013-07-23 10:24:54.2930893 +10:00  2013-07-23 10:24:54.293 84
有什么好处?为什么在查询中添加另一个参数会影响日期?(nb facilityID在发货通知表中为int)

为了证明这一点,如果我将起始日期向后移动一天到'20130722',我会得到我想要的3行结果,这似乎表明:

 CAST (OrderDateTime as DateTime) 
是否(有时?)根据其是否在SELECT或WHERE子句中,或是否存在其他参数进行不同处理??(这似乎不是一种统一的待遇)

有人能告诉我解决这个问题的方向吗?可能是service pack还是修补程序

Microsoft SQL Server 2008 R2(SP1)-10.50.2500.0(X64) 2011年6月17日00:54:03 版权所有(c)微软公司 Windows NT 6.1上的企业版(64位)(版本7601:Service Pack 1)

顺便说一句,我知道如果我创建一个只包含这些值的表,它会像你期望的那样工作(下面的代码),没有任何问题,所以它必须是环保的-是吗

CREATE TABLE #temp (orderdatetime DATETIMEOFFSET,facilityid int)
INSERT INTO #temp VALUES ('2013-07-23 08:26:02.9120644 +10:00',84)
INSERT INTO #temp VALUES ('2013-07-23 08:27:43.9571506 +10:00',84)
INSERT INTO #temp VALUES ('2013-07-23 10:24:54.2930893 +10:00',84)

SELECT     orderdatetime,CAST(orderdatetime AS datetime),facilityid
FROM #temp 
WHERE    CAST(OrderDateTime AS DATETIME) BETWEEN @StartDate AND @EndDate
AND facilityid =84

DROP TABLE #temp
试图做与你偶然发现的相反的事。也就是说,他试图将DateTimeOffset转换为UTC。但是有一些关于这种类型的铸造的讨论,我想你会发现相关的

在测试以下各项时:

DECLARE @Something datetimeoffset(7)

SET @Something = '2008-12-19 17:30:09.1234567 +11:00'

SELECT 1
WHERE DATEPART(hour, convert(datetime, @Something)) = 17

select cast(@Something as datetime)
select convert(datetime, @Something, 109)
CONVERT似乎不会在WHERE子句中将时区更改为UTC,也不会在SELECT子句中更改时区。但是,在转换中使用任何样式都将更改为UTC


希望这能有所帮助。

您对该列有索引吗?如果是这样,我认为您看到了中所述问题的另一个变体

根据该条,该问题已在以下方面得到解决:


我建议手动或通过Microsoft Update应用最新更新,看看您是否仍然存在问题。

是的,该列是索引的一部分。我将应用更新并让您知道。。。谢谢你的帮助
DECLARE @Something datetimeoffset(7)

SET @Something = '2008-12-19 17:30:09.1234567 +11:00'

SELECT 1
WHERE DATEPART(hour, convert(datetime, @Something)) = 17

select cast(@Something as datetime)
select convert(datetime, @Something, 109)