有时铸造的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
是的,该列是索引的一部分。我会应用更新并让你知道......感谢您的帮助 – Trubs