Как преобразовать 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 с помощью .Собственность клещей?
мне нужна хотя бы минутная точность.
8 ответов
Ну, я бы сделал это так:
select datediff(minute,'1990-1-1',datetime)
где '1990-1-1' - произвольное базовое datetime.
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;
использовать DateDiff
для этого:
DateDiff (DatePart, @StartDate, @EndDate)
DatePart
идет из года в год до наносекунды.
здесь.. http://msdn.microsoft.com/en-us/library/ms189794.aspx
Если целью этого является создание уникального значения из date
, вот что я бы сделал
DECLARE @ts TIMESTAMP
SET @ts = CAST(getdate() AS TIMESTAMP)
SELECT @ts
это получает дату и объявляет ее как простую метку
приведение к float или decimal вместо int / bigint.
целочисленная часть (перед десятичной точкой) представляет собой количество целых дней. После десятичной-дробные дни (т. е. время).
вы можете использовать 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
и вот версия bigint того же
DECLARE @ts BIGINT
SET @ts = CAST(CAST(getdate() AS TIMESTAMP) AS BIGINT)
SELECT @ts