【问题标题】:SELECT a datetimeoffset field by datetime按日期时间选择一个 datetimeoffset 字段
【发布时间】:2016-04-29 12:34:32
【问题描述】:

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

例如我的桌子有:

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

在当地时间格式中,第一行表示 2016-04-28 02:30:00,第二行表示 2016-04-28 03:30:00。我的意思是其中两个日期:2016-04-28。

当我想报告日期为 2016 年 4 月 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 是主键?

有没有更好的办法?

非常感谢...

【问题讨论】:

  • 标记使用的 dbms。 (该代码看起来不像 ANSI SQL...)
  • 谢谢。这是 MS SQL 服务器 2014。

标签: sql datetime sql-server-2014 datetimeoffset


【解决方案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 

【讨论】:

    【解决方案2】:

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

    CONVERT(DATETIME, dto, 109)
    

    TRY_CONVERT(DATETIME, dto, 109)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多