0

摘要: key列中的UTC时间编码后,如何提取属于UTC时间区间的记录?

UTC 编码:我确实有一个第三方表,其中记录包含 UTC 时间编码为字符串,如'2456065.80700942:0000002F'. 要获取该DATETIME类型的 UTC,可以使用以下公式:

CAST((CAST(LEFT(encodedUTC, 16) AS FLOAT) - 2415020.5) AS DATETIME)

他们说,冒号之前的部分是儒略日期编码为浮点数(以及浮点数到字符串)。我没有检查,它似乎工作。

查询:现在我有@fromUTCand@toUTCDATETIME类型。我可以选择:

SELECT CAST((CAST(LEFT(d.UTC, 16) AS FLOAT) - 2415020.5) AS DATETIME) AS UTC,
       ...
FROM dbo.Data AS d
WHERE CAST((CAST(LEFT(d.UTC, 16) AS FLOAT) - 2415020.5) AS DATETIME) > @fromUTC 
      AND CAST((CAST(LEFT(d.UTC, 16) AS FLOAT) - 2415020.5) AS DATETIME) < @toUTC

(我没有使用BETWEEN,因为我不想获得相同次数的记录。)它有效,但问题是转换公式重复了 3 次(如果不是,我不喜欢重复相同的代码必要的)。

我的问题是:我怎样才能写得SELECT更好?

感谢您的时间和信息,

彼得

4

2 回答 2

3

我会考虑添加一个包含此计算的视图,或者在表本身上添加一个计算列(如果您可以更改表定义)。

这些方法中的任何一种都会导致更清晰的最终选择。根据您选择与插入的频率,可能会有一些性能考虑因素,因此可能会以一种或另一种方式遮蔽您。

于 2013-01-21T13:34:59.037 回答
2

像使用 CTE

;with  cteName (UTC) as 
(
select SELECT CAST((CAST(LEFT(d.UTC, 16) AS FLOAT) - 2415020.5) AS DATETIME) AS UTC
FROM dbo.Data
)
select UTC
from cts where uct > @fromUTC and utc < @toUTC
于 2013-01-21T13:35:10.917 回答