web-dev-qa-db-fra.com

Comment convertir DateTime en un nombre avec une précision supérieure à jours en T-SQL?

Les deux requêtes ci-dessous se traduisent par le même nombre

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

Résultat

39978
39978

Le numéro généré ne sera différent que si les jours sont différents. Il existe un moyen de convertir le DateTime en un nombre plus précis, comme nous le faisons dans .NET avec la propriété .Ticks?

J'ai besoin d'au moins une minute de précision.

13
Jader Dias

Eh bien, je le ferais comme ceci:

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

où '1990-1-1' est un datetime de base arbitraire.

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

donne 39977.9590277778

8
RedFilter

Si le but de ceci est de créer une valeur unique à partir du date, voici ce que je ferais

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

Ceci obtient la date et la déclare comme un simple horodatage

2
Stan
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;
2
JeffM

Et voici une version bigint du même

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

Utilisez DateDiff pour cela:

DateDiff (DatePart, @StartDate, @EndDate)

DatePart va de l'année à la nanoseconde.

Plus ici .. http://msdn.Microsoft.com/en-us/library/ms189794.aspx

1
Raj More

CAST à un flottant ou décimal au lieu d'un int/bigint.

La partie entière (avant le point décimal) représente le nombre de jours entiers. Après la décimale se trouvent les jours fractionnaires (c'est-à-dire le temps).

0
richardtallent

Vous pouvez utiliser T-SQL pour convertir la date avant qu'elle ne parvienne à votre programme .NET. C'est souvent plus simple si vous n'avez pas besoin de faire de conversion de date supplémentaire dans votre programme .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
user1956147