gpt4 book ai didi

tsql - 如何在 T-SQL 中将 DATETIME 值转换为 FILETIME 值?

转载 作者:行者123 更新时间:2023-12-02 13:40:30 26 4
gpt4 key购买 nike

我需要在 T-SQL SELECT 语句(在 SQL Server 2000 上)中将 SQL Server DATETIME转换为 FILETIME。有内置函数可以做到这一点吗?如果没有,有人可以帮我弄清楚如何将此转换例程实现为 UDF(或只是简单的 Transact-SQL)吗?以下是我所知道的:

  1. FILETIME 是 64 位值,表示自 100 纳秒间隔以来的数量1601 年 1 月 1 日(UTC)(根据 MSDN: FILETIME Structure )。
  2. SQL Server 基准时间从 1900 年 1 月 1 日 00:00:00 开始(根据 SELECT CAST(0 as DATETIME))。

我找到了几个示例,展示了如何将 FILETIME 值转换为 T-SQL DATETIME(尽管我不能 100% 确定它们是准确的),但找不到任何有关反向转换的信息。即使是一般的想法(或算法)也会有帮助。

最佳答案

好吧,我想我自己能够实现这个。这是函数:

IF EXISTS 
(
SELECT 1
FROM sysobjects
WHERE id = OBJECT_ID('[dbo].[fnDateTimeToFileTime]')
AND type = 'FN'
)
BEGIN
DROP FUNCTION [dbo].[fnDateTimeToFileTime]
END
GO

-- Create function.
CREATE FUNCTION [dbo].[fnDateTimeToFileTime]
(
@DateTime AS DATETIME
)
RETURNS
BIGINT
BEGIN

IF @DateTime IS NULL
RETURN NULL

DECLARE @MsecBetween1601And1970 BIGINT
DECLARE @MsecBetween1970AndDate BIGINT

SET @MsecBetween1601And1970 = 11644473600000

SET @MsecBetween1970AndDate =
DATEDIFF(ss, CAST('1970-01-01 00:00:00' as DATETIME), @DateTime) *
CAST(1000 AS BIGINT)

RETURN (@MsecBetween1601And1970 + @MsecBetween1970AndDate) * CAST(10000 AS BIGINT)
END
GO

IF @@ERROR = 0
GRANT EXECUTE ON [dbo].[fnDateTimeToFileTime] TO Public
GO

它似乎准确到 1 秒,这对我来说没问题(由于数据溢出,我无法使其更准确)。我用了TimeAndDate web tool计算日期之间的持续时间。

你觉得怎么样?

关于tsql - 如何在 T-SQL 中将 DATETIME 值转换为 FILETIME 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2924192/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com