有时,将 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
此查询的结果是(如您所料)
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 is int in consignmentNote Table)
只是为了证明这一点 - 如果我将 StartDate 移回一天到“20130722”,我会得到我正在寻找的 3 行结果,这似乎表明:
CAST (OrderDateTime as DateTime)
是否(有时?)根据其在 SELECT 或 WHERE 子句中是否有不同的处理方式,或者是否有其他参数?(好吧,这似乎不是一个统一的处理方式)
谁能指出我解决这个问题的任何方向?它可能是服务包或修补程序
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 2011 年 6 月 17 日 00:54:03 版权所有 (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 (Build 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