Как преобразовать DateTime в число с точностью больше дней в T-SQL? - PullRequest
13 голосов
/ 15 июня 2009

Оба запроса ниже переводятся на одно и то же число

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?

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

Ответы [ 8 ]

22 голосов
/ 15 июня 2009

Ну, я бы сделал это так:

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

где '1990-1-1' - произвольная базовая дата / время.

8 голосов
/ 15 июня 2009
SELECT CAST(CONVERT(datetime,'2009-06-15 23:01:00') as float)

дает 39977,9590277778

2 голосов
/ 31 июля 2015

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

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

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

2 голосов
/ 25 июня 2013
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;
1 голос
/ 15 июня 2009

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

DateDiff (DatePart, @StartDate, @EndDate)

DatePart идет от года к наносекунде.

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

0 голосов
/ 31 июля 2015

А вот бигинт версия того же

DECLARE @ts BIGINT 
SET @ts = CAST(CAST(getdate() AS TIMESTAMP) AS BIGINT)
SELECT @ts
0 голосов
/ 08 января 2013

Вы можете использовать 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
0 голосов
/ 15 июня 2009

CAST в число с плавающей запятой или десятичное число вместо int / bigint.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...