2016-11-10 5 views
1

Dans mon info temps d'application est stockée dans db dans un champ de flotteur, où:Conversion d'un nombre flottant dans 0-1 plage en temps

0 means 0 AM; 

0.5 12 AM 

0,999305555555556 is 11:59 PM 

La conversion en information de temps se fait actuellement dans ma demande par Ui Les composants qui sont conçus pour fonctionner de cette manière pour enregistrer des informations temporelles flottantes (cela a été décidé avant que le type de données TIME ne soit introduit dans SQL Server 2008R2). La question est:
comment effectuer cette conversion

+2

Errm .... N'êtes-vous pas celui qui sait comment convertir float à temps dans votre cas puisque votre application le fait déjà à la couche de l'interface utilisateur? –

+1

Vérifiez le code du composant UI peut-être? – Magnus

+0

Mon application fonctionne "telle quelle" depuis 15 ans et c'est la première fois que j'ai besoin de récupérer avec une requête sql rime information. Jusqu'à présent, il était pratique de déléguer cette tâche à la couche Ui. Live est fait aussi de simples blocs parfois. Personnellement, je trouve vos commentaires inutiles. Merci d'avoir pris le temps de lire. – LaBracca

Répondre

4

minute a 60 secondes,
Hour a 3600 secondes,
Day a 86400 secondes,

Multipliez votre (0-1) par flotteur 86400 (appelons-le total_seconds),

1) étage de la division du total_seconds par 3600 sera vos heures
2) heures Soustraire * 3600 à partir de votre total_seconds
3) étage de division de total_seconds de 60 minutes sera votre
4) Soustraire minutes * 60 de vos total_seconds
6) Ce qui reste sera votre seconde

DECLARE @raw_input FLOAT = 0.999305555555556 
DECLARE @total_seconds INT 
DECLARE @hours INT, @minutes INT, @seconds INT 

SET @total_seconds = @raw_input * 86400 
SET @hours = FLOOR(@total_seconds/3600) 
SET @total_seconds = @total_seconds - @hours * 3600 
SET @minutes = FLOOR(@total_seconds/60) 
SET @seconds = @total_seconds - @minutes * 60 

Edit: ou beaucoup plus simple, une adaptation similaire question/answer:

DECLARE @raw_input FLOAT = 0.999305555555556 
DECLARE @secondss decimal = @raw_input*86400 
SELECT CAST(CONVERT(VARCHAR,DATEADD(SECOND, @secondss, 0),108) AS TIME) 

>23:59:00.0000000 
+0

Merci beaucoup! La version beaucoup plus simple fonctionne parfaitement bien! – LaBracca