2016-04-29 132 views
1

我有一个带有主键的datetimeoffset字段的表。我想用日期时间过滤我的表格。按日期时间选择datetimeoffset字段

例如我的表有:

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

在本地时间格式,第一行是指2016年4月29日2点30分零零秒排和第二排是指2016年4月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在datetimetimeset字段中查看UTC时间。

我能得到我真正想要的是这样的:

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

第一和第二行正在添加有。

问题是,我是否失去了投射表演?系统寻找和铸造每一行(顺序读取),即使dto是主键?

有没有更好的方法?

非常感谢...

+0

标签使用的数据库管理系统。 (该代码看起来不像ANSI SQL ...) – jarlh

+0

谢谢。这是MS SQL服务器2014。 –

回答

0

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

CONVERT(DATETIME, dto, 109) 

TRY_CONVERT(DATETIME, dto, 109) 

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

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