Как преобразовать DateTime в число с точностью больше, чем дни в T-SQL?

Оба запроса ниже переходят к одному и тому же номеру

SELECT CONVERT(bigint,CONVERT(datetime,'2009-06-15 15:00:00'))
SELECT CAST(CONVERT(datetime,'2009-06-15 23:01:00') as bigint)

Результат

39978
39978

Сгенерированное число будет отличаться, только если дни разные. Есть ли способ конвертировать DateTime в более точное число, как это происходит в .NET с свойством .Ticks?

Мне нужна хотя бы минутная точность.

Ответы

Ответ 1

Хорошо, я бы сделал это вот так:

select datediff(minute,'1990-1-1',datetime)

где "1990-1-1" - произвольное базовое datetime.

Ответ 2

SELECT CAST(CONVERT(datetime,'2009-06-15 23:01:00') as float)

дает 39977.9590277778

Ответ 3

DECLARE @baseTicks AS BIGINT;
SET @baseTicks = 599266080000000000; --# ticks up to 1900-01-01

DECLARE @ticksPerDay AS BIGINT;
SET @ticksPerDay = 864000000000;

SELECT CAST(@baseTicks + (@ticksPerDay * CAST(GETDATE() AS FLOAT)) AS BIGINT) AS currentDateTicks;

Ответ 4

Используйте DateDiff для этого:

DateDiff (DatePart, @StartDate, @EndDate)

DatePart переходит с года вниз на наносекунду.

Подробнее здесь.. http://msdn.microsoft.com/en-us/library/ms189794.aspx

Ответ 5

Если целью этого является создание уникального значения из date, вот что я хотел бы сделать

DECLARE @ts TIMESTAMP 
SET @ts = CAST(getdate() AS TIMESTAMP)
SELECT @ts

Это получает дату и объявляет ее как простую временную метку

Ответ 6

CAST для float или decimal вместо int/bigint.

Целая часть (до десятичной точки) представляет число целых дней. После десятичного числа дробные дни (т.е. Время).

Ответ 7

Вы можете использовать T-SQL для преобразования даты до ее загрузки в вашу программу .NET. Это часто бывает проще, если вам не нужно выполнять дополнительное преобразование даты в вашей программе .NET.

DECLARE @Date DATETIME = Getdate()
DECLARE @DateInt INT = CONVERT(VARCHAR(30), @Date, 112)
DECLARE @TimeInt INT = REPLACE(CONVERT(VARCHAR(30), @Date, 108), ':', '')
DECLARE @DateTimeInt BIGINT = CONVERT(VARCHAR(30), @Date, 112) + REPLACE(CONVERT(VARCHAR(30), @Date, 108), ':', '')
SELECT @Date as Date, @DateInt DateInt, @TimeInt TimeInt, @DateTimeInt DateTimeInt

Date                    DateInt     TimeInt     DateTimeInt
------------------------- ----------- ----------- --------------------
2013-01-07 15:08:21.680 20130107    150821      20130107150821

Ответ 8

И вот версия bigint того же

DECLARE @ts BIGINT 
SET @ts = CAST(CAST(getdate() AS TIMESTAMP) AS BIGINT)
SELECT @ts