4 votes

Convertir un int en temps (valeurs étranges)

En examinant un serveur construit par quelqu'un d'autre, j'ai remarqué que l'heure est stockée au format int. En insérant quelques données, j'ai pu faire la déduction suivante :

285571 correspond à 6:51:00am (plus moins deux secondes)

Pour ceux qui le demandent, la date est stockée en jours depuis le 1/1/1900 dans une autre colonne.

La question est la suivante : quelle est la formule magique utilisée pour la conversion du temps ?

Merci.

6voto

Shnugo Points 45894

Essayez ça :

DECLARE @t DATETIME='06:51:00';
SELECT CAST(@t AS FLOAT)

Le résultat

0,285416666666667

Votre valeur ridicule semble être la partie après la virgule, c'est-à-dire la fraction de jour. Vous pourriez dire Après 28,54% d'une journée complète, il est 06h51.

EDIT

Grâce à Martin Smith, je dois corriger mon "DATETIME is a FLOAT".

A DATETIME est stocké sous la forme de deux entiers de 4 octets combinés à une structure de 8 octets en réalité. Le premier int est pris comme un compte de jour, le second est un compteur de ticks depuis minuit. Vous pouvez lire este .

Une autre représentation commune (je pense que c'est valable pour VB(A), Access et les systèmes apparentés) est un datetime comme float . La partie entière est le compte du jour et la fraction est la fraction du jour. Le serveur SQL convertit cela implicitement :

SELECT CAST(0.5 AS DATETIME)

Le résultat est 1900-01-01 12:00:00.000

Pour obtenir votre temps (le formule magique ) vous devez faire ceci :

SELECT CAST(0.285571 AS DATETIME)

UPDATE la solution magique

DECLARE @t INT=285571;
SELECT CAST(CAST('0.' + CAST(@t AS VARCHAR(100)) AS FLOAT) AS DATETIME)

Vous pourriez vouloir ajouter une autre CAST( ... AS TIME) (selon la version de votre serveur SQL)

Et pour les amateurs de calculs purs

SELECT CAST(CAST(CAST(@t AS FLOAT)/CAST(POWER(10,CAST(LOG10(@t) AS INT)+1) AS FLOAT) AS DATETIME) AS TIME)

UPDATE

Dans votre cas, il serait peut-être préférable de combiner votre compteur journalier et votre valeur temporelle avec une fonction . au niveau de la corde, lancez-la sur float et le résultat à datetime .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X