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

标签 tsql datetime filetime

我需要在 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/

相关文章:

python - 按时间过滤sqlalchemy sqlite datetime列

datetime - 如何使用 MonoTouch 将 DateTime 格式化为短时间格式的本地用户区域设置

vbscript - 如何在 VBScript 中将 64 位数字拆分为高 32 位和低 32 位?

vba - 用毫秒获取文件的最后修改日期?

windows - Windows FILETIME 结构是否包含闰秒?

c# - SQL Server-枢轴

sql-server - null 未按预期工作的情况

tsql - SQL Reporting Services,过滤不在 DISTINCT SELECT 语句中的字段?

sql - 统计所有直接或间接向经理汇报的下属

r - 在 sqldf 中将整数值转换为日期时间