2010-05-27 6 views
3

나는 (SQL 서버 2000)를 T-SQL SELECT 문에을 FILETIME하기 위해 SQL 서버 DATETIME을 변환해야합니다. 이 작업을 수행 할 수있는 내장 함수가 있습니까? 그렇지 않다면 누군가가이 변환 루틴을 UDF (또는 단순한 Transact-SQL)로 구현하는 방법을 이해할 수 있습니까? 여기에 내가 아는 것입니다 :T-SQL에서 DATETIME을 FILETIME 값으로 변환하는 방법은 무엇입니까?

  1. FILETIME은 (MSDN: FILETIME Structure 당) 이후 1601년 1월 1일 (UTC)를 100 나노초 간격의 수를 나타내는 64 비트 값입니다.
  2. SQL Server 기본 시간은 1900-01-01 00:00:00 (SELECT CAST (DATETIME 0))부터 시작됩니다.

나는 (나는 그들이하지만, 정확한 100 % 확신) T-SQL의 DATETIME에 FILETIME 값을 변환하는 방법을 보여주는 몇 가지 예를 찾았지만, 역변환에 대해 아무것도 찾을 수 없습니다. 일반적인 아이디어 (또는 알고리즘)조차도 도움이됩니다.

답변

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 

(I 인해 데이터 오버 플로우가 더 정확하게 만들 수 없습니다) 나와 함께 괜찮 1 초까지 정확한 것 같다 : 여기 기능입니다. 나는 TimeAndDate web tool을 사용하여 날짜 사이의 기간을 계산했습니다.

당신은 어떻게 생각하십니까?

2

2 SQL 서버 시간 시대는 DATETIME으로 1900-01-01 0시 0분 0초 (SELECT CAST 당 (0 )에 시작합니다.

아니, 그 기본 날짜, 날짜입니다 1753

실행이

select cast('17800122' as datetime) 

출력에서 ​​시작

,536,913 63,210

1780년 1월 22일 00 : 00 : 00.000

하지만 그 ... 그러나 그레고리력과 율리우스 력을 기억 추가해야합니다 있도록이 여전히 FILETIME 미만은

(또한 이유는 날짜는 1753에서 시작 있음)
+0

오, 좋아요. 이제는 더 혼란 스럽습니다. :-) –

+0

적어도 SQL Server 2008에서 datetime2는 1 년으로갑니다. – SQLMenace

관련 문제