2009-09-14 7 views
1

Je veux afficher l'heure comme mr.xxx login il ya 1 minute ou 1 hor ago ou 2 journées de cela ou il ya 1 mois ou 1year. comment puis-je écrire la requête à afficher comme ça [par exemple dans notre stackoverflow nous voyons mr.xx rejoint il y a 5 jours. il demande la question il y a 2 minutes] aidez-moi s'il vous plaîtrequête pour datetime

+0

Vous devriez certainement le faire dans votre code frontal (C#, VB, peu importe) plutôt qu'une requête SQL. – LukeH

+0

@surya: alors vous devriez faire la chose polie et appropriée et accepter la meilleure réponse/celle qui a vraiment résolu votre problème. Pour accepter la réponse, veuillez cliquer sur la coche à gauche de la réponse sous le "0" avec les flèches haut et bas. Si quelqu'un vous aide, veuillez avoir la gentillesse d'accepter la réponse. –

Répondre

2

Cet exemple devrait fonctionner sur n'importe quelle version de SQL Server.

Il est plus bavard que nécessaire pour clarifier le fonctionnement.

--create test data 
create table #t 
(id int 
,lastTime datetime 
) 

insert #t 
select 1,dateadd(mi,-1,getdate()) 
union select 2,dateadd(hh,-1,getdate()) 
union select 3,dateadd(dd,-1,getdate()) 
union select 4,dateadd(mm,-1,getdate()) 
union select 5,dateadd(yy,-1,getdate()) 
union select 6,dateadd(yy,-5,getdate()) 
union select 7,NULL 

-- carry out formatting to handle pluralisation 
SELECT id 
     ,ISNULL(lastAction,'Never') 
     + CASE WHEN lastVal > 1 
       THEN 's ago' 
       WHEN lastVal = 1 
       THEN ' ago' 
       ELSE '' 
     END 
FROM 
(
     -- Use coalesce to select the first non-null value from the matrix 
     SELECT id 
       ,COALESCE(CAST(years as VARCHAR(20)) + ' year' 
         ,CAST(months as VARCHAR(20)) + ' month' 
         ,CAST(days as VARCHAR(20)) + ' day' 
         ,CAST(hours as VARCHAR(20)) + ' hour' 
         ,CAST(minutes as VARCHAR(20)) + ' minute' 
         ,CAST(secs as VARCHAR(20)) + ' second' 
         ) as lastAction 
       ,COALESCE(years 
         ,months 
         ,days 
         ,hours 
         ,minutes 
         ,secs 
         ) as lastVal 
     FROM     
     (
       -- create a matrix of elapsed time 
       SELECT id 
         ,datediff(ss,lastTime,getdate()) secs 
         ,NULLIF(datediff(mi,lastTime,getdate()),0) minutes 
         ,NULLIF(datediff(hh,lastTime,getdate()),0) hours 
         ,NULLIF(datediff(dd,lastTime,getdate()),0) days 
         ,NULLIF(datediff(mm,lastTime,getdate()),0) months 
         ,NULLIF(datediff(yy,lastTime,getdate()),0) years 
       from #t 
     ) as X 
) AS Y 
+0

wow bonne requête Ed harper merci –

+0

Bonne réponse Ed +1 – kevchadders

1

Je m'attends à ce que vous gardiez un journal de la dernière connexion des utilisateurs dans une table SQL dans votre base de données, qui peut être utilisée pour l'historique d'audit.

Avec cette information, vous pouvez créer une procédure stockée qui peut récupérer des informations lorsque l'utilisateur connecté dernier.

par exemple Exemple SQL pour la dernière connexion (IN DAYS)

DECLARE @LoggedIn AS DATETIME 
SET @LoggedIn = '01 Apr 2009' 

SELECT DATEDIFF(dd, @LoggedIn, GETDATE()) AS 'Last Logged In (DAYS)' 
+0

ok merci kevchadders –