2013-07-23 35 views
2

有时铸造的DateTimeOffset为datetime似乎采取的DateTimeOffset现场发回UTC铸造的DateTimeOffset到DateTime和结果对比为DateTime

我想找到特定的日期之间发生的所有订单。 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 

这个查询的结果是(正如你所期望的)

OrderDateTime       LocalTime     Facilityid 
2013-07-23 08:26:02.9120644 +10:00 2013-07-23 08:26:02.913 84 
2013-07-23 08:27:43.9571506 +10:00 2013-07-23 08:27:43.957 84 
2013-07-23 10:24:54.2930893 +10:00 2013-07-23 10:24:54.293 84 

但我还需要筛选此结果对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 是consignmentNote表 INT)

只是为了证明这一点 - 如果我每天移动起始日期回“20130722”,我得到了3行的结果我找的,这似乎表明, :

CAST (OrderDateTime as DateTime) 

是(有时?)处理不同,具体取决于其是否在SELECT或WHERE子句,或者有其他参数?? (好吧,它似乎并不统一的待遇)

任何人都可以指出我在任何方向来解决这个问题吗?难道是服务包或修补程序

的Microsoft SQL Server 2008 R2(SP1) - 10.50.2500.0(X64) 2011年6月17日0时54分03秒 版权所有(c)Microsoft公司 企业版(64位)在Windows NT 6.1(内部版本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 

回答

1

This guy试图做的你偶然发现的正好相反。也就是说,他试图将他的日期时间偏移量转换为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不会将时区更改为UTC在WHERE子句中,并在SELECT子句中不会改变时区。但是,在转换中使用任何样式都将更改为UTC。

希望这会有所帮助。

1

您是否有该列的索引?如果是这样,我认为你看到KB2715289中描述的问题的另一种变化。

根据该文章的问题已修复:

我建议应用最新更新手动或通过Microsoft Update和看看你是否仍然有问题。

+0

是的,该列是索引的一部分。我会应用更新并让你知道......感谢您的帮助 – Trubs