按datetime选择datetimeoffset字段

时间:2016-04-29 12:34:32

标签: sql datetime sql-server-2014 datetimeoffset

我有一个带有datetimeoffset字段的表,它是主键。我想用日期时间过滤我的表。

例如我的表格有:

2016-04-27 23:30:00.7684500 +03:00
2016-04-28 00:30:00.7684500 +03:00

以当地时间格式,第一行表示2016-04-29 02:30:00,第二行表示2016-04-28 03:30:00。我的意思是他们中的两个:2016-04-28。

当我想在2016-04-28日期报告交易时,我只获得第二行。

declare @fromDate datetime
select @fromDate = '2016-04-28 00:00:00'
select * from MYTABLE where dto > @fromDate

因为,sql在datetimeoffset字段中查看UTC时间。

我可以得到我真正想要的东西:

declare @fromDate datetime
select @fromDate = '2016-04-28 00:00:00'
select * from MYTABLE where CAST(dto as datetime) > @fromDate

第一和第二行即将到来。

问题是我是否因为施法而失去了表现?系统查找和转换每一行(顺序读取),即使dto是主键?

还有更好的方法吗?

非常感谢......

2 个答案:

答案 0 :(得分:1)

如果你的偏移量(+3)是一个常数,你可以试试这个:

declare @fromDate datetime
select @fromDate = '2016-04-28 00:00:00'
select * from MYTABLE where dateadd(hour, 3, dto) > @fromDate

或者您可以使用TODATETIMEOFFSET

如下:

select * from MYTABLE where TODATETIMEOFFSET(dto, '03:00') > @fromDate 

答案 1 :(得分:0)

绝对......我建议在表格中添加一个计算字段。这样,转换将在SQL中自动进行,并且查询中不需要CAST或CONVERT。在计算字段上搜索并插入代码

CONVERT(DATETIME, dto, 109)

TRY_CONVERT(DATETIME, dto, 109)

我会使用TRY_CONVERT,因为您可以专门为新计算字段设置DateTime的格式,如果由于某种原因,dto不是有效日期,它将插入NULL而不是失败。