Je travaille sur SQL SERVER 2016. J'ai besoin d'afficher le temps écoulé depuis la dernière action à l'utilisateur. Il doit être au format "Dernière action il y a 3 minutes" ou "Dernière action il y a 5 jours". J'ai besoin d'une partie de date dynamique pour les intervalles car je ne sais pas combien de temps s'est écoulé. Le système doit obtenir un intervalle de temps (s'il est inférieur à une heure, il doit être en minutes. S'il est inférieur à un jour, il doit être en heures) et le temps passé dans ce format d'intervalle (comme il y a 3 heures ou il y a 1 jour).

J'écris ceci pour l'instant

FORMAT(DATEDIFF(MINUTE,MAX(myDate),GETDATE()), 'MINUTE' , 'en-US')

Mais c'est le résultat est

"La dernière action remonte à MINUTE"

Et aussi je voudrais obtenir l'heure dans d'autres formats comme "il y a 5 jours" ou "il y a 4 heures" si l'intervalle de temps a changé.

Comment puis-je y parvenir, je n'ai pas trouvé le bon intervalle datediff et FORMAT

1
AlpUygur 7 oct. 2020 à 11:59

2 réponses

Meilleure réponse

Je pense que tu veux:

select 'Last action was '
       (case when datediff(day, MAX(myDate), GETDATE()) > 0
             then concat(datediff(day, MAX(myDate), GETDATE()), ' day(s) ago')
             when datediff(hour, MAX(myDate), GETDATE()) > 0
             then concat(datediff(hour, MAX(myDate), GETDATE()), ' hours(s) ago')
             when datediff(minute, MAX(myDate), GETDATE()) > 0
             then concat(datediff(minute, MAX(myDate), GETDATE()), ' minute(s) ago')
             when datediff(second, MAX(myDate), GETDATE()) > 0
             then concat(datediff(second, MAX(myDate), GETDATE()), ' second(s) ago')
             else 'Just happened!'
         end)

Le case commence à l'unité la plus grande (jours) et vérifie si cela s'applique.

En fait, datediff() n'est peut-être pas ce que vous voulez. Il s'aligne sur les jours civils. Donc, "il y a 1 jour" signifie vraiment "hier" quelle que soit l'heure. Peut-être qu'une méthode plus précise serait:

select 'Last action was '
       (case when dateadd(day, 1, MAX(myDate) < GETDATE()
             then concat(datediff(day, MAX(myDate), GETDATE()), ' day(s) ago')
             when dateadd(hour, 1, MAX(myDate)) < GETDATE())
             then concat(datediff(hour, MAX(myDate), GETDATE()), ' hours(s) ago')
             when dateadd(minute, 1, MAX(myDate)) < GETDATE()
             then concat(datediff(minute, MAX(myDate), GETDATE()), ' minute(s) ago')
             when dateadd(second, 1, MAX(myDate)) < GETDATE())
             then concat(datediff(second, MAX(myDate), GETDATE()), ' second(s) ago')
             else 'Just happened!'
         end)

Cela garantit qu'il y a au moins une unité entière dans le passé avant de choisir cette unité.

0
Gordon Linoff 7 oct. 2020 à 11:43

Voici un exemple qui utilise CONCAT et certaines valeurs codées en dur pour produire une sortie comme requis dans votre question:

SELECT
    CONCAT('Last Action was ',
            DATEDIFF(MINUTE, '2020-10-07T11:06:22', '2020-10-07T11:07:22'),
            ' MINUTE ago'
    ) AS "Elapsed"

La sortie est

|         Elapsed            |
------------------------------
|Last Action was 1 MINUTE ago|

Vous devrez remplacer ces horodatages codés en dur par les valeurs de votre choix et l'intervalle de la fonction DATEDIFF également si vous voulez que différentes unités soient prises en compte.

Une autre solution possible serait la suivante:

SELECT
    'Last Action was ' +
    CASE WHEN DATEDIFF(DAY, '2020-10-07T11:06:22', '2020-10-08T11:07:22') > 0
        THEN CONCAT(DATEDIFF(DAY, '2020-10-07T11:06:22', '2020-10-08T11:07:22'), ' DAY(S)')
        ELSE ''
    END +
    CASE WHEN DATEDIFF(HOUR, '2020-10-07T11:06:22', '2020-10-08T11:07:22') % 24 > 0
        THEN CONCAT(DATEDIFF(HOUR, '2020-10-07T11:06:22', '2020-10-08T11:07:22') % 24, ' HOUR(S)')
        ELSE ''
    END + ' and ' +
    CASE WHEN DATEDIFF(MINUTE, '2020-10-07T11:06:22', '2020-10-08T11:07:22') % 60 > 0
        THEN CONCAT(DATEDIFF(MINUTE, '2020-10-07T11:06:22', '2020-10-08T11:07:22') % 60, ' MINUTE(S) ago')
        ELSE ''
    END AS "Message"

Qui sort

|                  Message                     |
------------------------------------------------
| Last Action was 1 DAY(S) and 1 MINUTE(S) ago |

Comme vous pouvez le voir, les heures ne sont pas mentionnées dans la colonne de résultat car leur valeur serait exactement 24 heures, ce qui est déjà imprimé d'un jour.

Vous devrez bidouiller pour obtenir tous les résultats possibles sous la forme Dernière action il y a 2 heures et 1 minute ou Dernière action il y a 1 jour, 2 heures et 1 minute ...

0
deHaar 7 oct. 2020 à 10:10