2010-05-27 41 views
3

我需要一個SQL Server DATETIME轉換在T-SQL SELECT語句FILETIME(SQL Server 2000上)。有沒有一個內置的功能來做到這一點?如果不是,有人可以幫我弄清楚如何將這個轉換例程作爲UDF(或者簡單的Transact-SQL)來實現嗎?這是我知道的:如何將DATETIME轉換爲T-SQL中的FILETIME值?

  1. FILETIME爲代表的100毫微秒間隔的數量,因爲 1601年1月1日(UTC)的64位值(每MSDN: FILETIME Structure)。
  2. SQL Server基準時間從1900-01-01 00:00:00開始(每個SELECT CAST(0作爲DATETIME))。

我發現了幾個例子,展示瞭如何將FILETIME值轉換爲T-SQL DATETIME(雖然我不是100%確定它們是準確的),但找不到有關反向轉換的任何內容。即使是一般的想法(或算法)也會有所幫助。

回答

3

好的,我想我能夠自己實現這一點。這裏是功能:

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來計算日期之間的持續時間。

您認爲如何?

2

2 SQL Server時,時代開始就 1900-01-01 00:00:00(每SELECT CAST(0 爲DATETIME)。

不,這是基礎日期,日期時間開始於1753

來看,這種

select cast('17800122' as datetime) 

輸出

1780-01-22 00:00:00.000

但是,這仍然比文件時間少,因此您需要添加...但請記住公曆時間和Julian日曆(也是因爲datetime始於1753年)

+0

哦,太棒了,現在我更加困惑了。 :-) – 2010-05-27 19:36:12

+0

至少在SQL Server 2008中,datetime2進入第1年 – SQLMenace 2010-05-27 19:42:23

相關問題