Jump to content

Descobrir tempo desde o ultimo post


gambas
 Share

Recommended Posts

Boas malta...

Tenho duas duvidas

a 1ª gostava de saber como obtenho o tempo exacto de uma inserção , por exemplo de um 'post', mas que me apresentasse os dados consoante as 'unidades horárias'.

Por exemplo, se postei algo há 20 segundos, ele apenas dizer '20 segundos' mas se já foi há 2 horas não vai dizer 7200 segundos mas sim 2 horas.

e a outra, queria saber se me podem ajudar a construir uma query que apenas me retornasse um valor boolean, para saber se uma data actual já passou uma data específica em 2 dias.

Link to comment
Share on other sites

Olá,

Estás a fazer em que SGBD? SQL Server? MySQL? Outro? Qual?

Vou assumir que estás a fazer em SQL Server. Se for outro... Depois vê-se  🙂

a 1ª gostava de saber como obtenho o tempo exacto de uma inserção , por exemplo de um 'post', mas que me apresentasse os dados consoante as 'unidades horárias'.

Por exemplo, se postei algo há 20 segundos, ele apenas dizer '20 segundos' mas se já foi há 2 horas não vai dizer 7200 segundos mas sim 2 horas.

Acho que já percebi o que pretendes. Penso que não te interessa o tempo exacto da inserção, mas sim a diferença do tempo entre agora (seja um momento qual for) e o tempo de inserção.

Assim, sugiro a criação de um campo na tua tabela, por exemplo com o nome CriacaoData, do tipo DATETIME e em que o default value é GETDATE(). Assim, sempre que inserires um registo nessa tabela, o campo CriacaoData é automaticamente inicializado com a Data/Hora do sistema.

Sugiro a criação de uma função para essa funcionalidade:

CREATE FUNCTION dbo.MostraTempo
(
    @Tempo INT
)
RETURNS VARCHAR(50)
AS
BEGIN
    IF @tempo >= 172800
    BEGIN
        SET @tempo = @tempo / (60 * 60 * 24)
        RETURN CAST(@tempo AS VARCHAR(5)) + ' dias'
    END

    IF @tempo >= 86400
    BEGIN
        RETURN '1 dia'
    END

    IF @tempo >= 7200
    BEGIN
        SET @tempo = @tempo / (60 * 60)
        RETURN CAST(@tempo AS VARCHAR(2)) + ' horas'
    END

    IF @tempo >= 3600
    BEGIN
        SET @tempo = @tempo / 60
        RETURN '1 hora'
    END

    IF @tempo >= 120
    BEGIN
        SET @tempo = @tempo / 60
        RETURN CAST(@tempo AS VARCHAR(2)) + ' minutos'
    END

    IF @tempo >= 60
    BEGIN
        RETURN '1 minuto'
    END

    IF @tempo > 1
    BEGIN
        RETURN CAST(@tempo AS VARCHAR(2)) + ' segundos'
    END

    RETURN '1 segundo'
END

Depois, podes usar essa função da seguinte forma, por exemplo:

SELECT dbo.MostraTempo(DATEDIFF(S, '2010-01-01 12:00:00', '2010-01-20 12:00:00')) AS Mensagem
SELECT dbo.MostraTempo(DATEDIFF(S, '2010-01-01 12:00:00', GETDATE())) AS Mensagem
SELECT *, dbo.MostraTempo(DATEDIFF(S, CriacaoData, GETDATE())) AS Mensagem FROM Utilizadores

e a outra, queria saber se me podem ajudar a construir uma query que apenas me retornasse um valor boolean, para saber se uma data actual já passou uma data específica em 2 dias.

Neste caso pretendes saber se passaram 2 dois dias ou 48 horas? É diferente.

Por exemplo, a difererença entre as datas/horas '2010-01-01 18:00:00' e '2010-01-03 02:00:00' em termos de número de dias, são dois dias, mas acabam por não serem dois dias completos pois não ultrapassaram as 48 horas.

Assumindo que pretendes dois dias efectivamente, independentemente da hora, podes fazer da seguinte forma:

SELECT CASE WHEN DATEDIFF(D, '2010-01-01 12:00:00', '2010-01-02 12:00:00') <= 2 THEN 0 ELSE 1 END AS Mais2Dias
SELECT CASE WHEN DATEDIFF(D, '2010-01-01 12:00:00', '2010-01-06 12:00:00') <= 2 THEN 0 ELSE 1 END AS Mais2Dias
SELECT *, CASE WHEN DATEDIFF(D, CriacaoData, GETDATE()) <= 2 THEN 0 ELSE 1 END AS Mais2Dias FROM Utilizadores

Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Link to comment
Share on other sites

boas,

e desde ja obrigado pela resposta.

a base de dados é mysql...

relativamente á 1ª questão, percebi o que fizeste, mas traduzir isso para a base de dados que estou a utilizar não esou a ver como.

na segunda questão quero que passe exactamente 48 horas.

será que alguem conhece alguma classe em php que faça isto? se bem que isto tem mais a ver com base de dados penso eu!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.