2010-05-27 1 views
3

мне нужно преобразовать DATETIME значения SQL Server для FileTime в T-SQL ЗЕЬЕСТА (на SQL Server 2000). Есть ли встроенная функция для этого? Если нет, может кто-нибудь помочь мне выяснить, как реализовать эту процедуру преобразования как UDF (или просто Transact-SQL)? Вот то, что я знаю:Как преобразовать значение DATETIME в значение FILETIME в T-SQL?

  1. FILETIME является 64-разрядное значение, представляющее число интервалов по 100 наносекунд, так 1 января 1601 (UTC) (за MSDN: FILETIME Structure).
  2. Начальное время SQL Server начинается с 1900-01-01 00:00:00 (за каждый выбор 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 Серверное время эра начинается 1900-01-01 00:00:00 (за SELECT CAST (0 как DATETIME).

Нет, это дата основания, даты и времени начинается в 1753

перспективе это

select cast('17800122' as datetime) 

выходного

1780-01-22 00: 00: 00,000

Но это все равно меньше, чем FILETIME поэтому вам нужно добавить, что ... Однако помните, григорианский и юлианский календарь (также причина того, что даты и времени начинается в 1753 году)

+0

О, отлично, теперь я еще более смущен. :-) –

+0

Ну, по крайней мере, в SQL Server 2008 datetime2 отправляется на год 1 – SQLMenace

 Смежные вопросы

  • Нет связанных вопросов^_^