Jump to content

adicionar horas á base de dados SQL e depois somar


passado

Recommended Posts

Boas pessoal eu no meu projecto tenho de adicionar horas de trabalho a determinada maquina. que tipo de campo uso no SQL o datetime? ja testei mas quando escrevo 20:00 numa masktextbox depois na gridview so aparece a data, e eu queria so mesmo guarda as horas para mais tarde somar todas as horas da maquina X, como devo fazer?

Cumprimentos

Link to comment
Share on other sites

Se converteres para Date o valor que vem de um campo datetime da BD, à partida passarias a ter qualquer elemento que precises.

Podes é considerar outra coisa: É para registar só horas? Um campo numérico... horas e minutos? Numérico com casas decimais... é uma questão matemática... Só porque vais ter sempre informação que à partida não precisas como o ano, mes e dia.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

Se converteres para Date o valor que vem de um campo datetime da BD, à partida passarias a ter qualquer elemento que precises.

Podes é considerar outra coisa: É para registar só horas? Um campo numérico... horas e minutos? Numérico com casas decimais... é uma questão matemática... Só porque vais ter sempre informação que à partida não precisas como o ano, mes e dia.

E com casas decimais, ao adicionar 10h00 adicionava 10,00 é isso?

Link to comment
Share on other sites

Exacto.

E 10h30min ficaria 10,50, e por aí fora.

Basta relacionares a unidade com 60 minutos.

Se 1 hora são 60 minutos então 30 minutos são (30*1)/60 = 0,5 horas

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

Por exemplo.

Ou delimitado, digamos, por esse "h" das horas.

Tornava-se mais fácil se tivesses os dois elementos separados.

Bastava passares as horas "as is" e fazeres uma "regra de 3 simples" para converteres os minutos em fracção da unidade.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

ok ja entendi a parte de inserir, so tenho duas duvidas:

1ª consigo ir a masktextbox buscar os valores em separado ir buscar o 10 aos primeiros espaços e depois o 30?

2ª ok adiciono, somo os campos todos correspondentes a maquina X, vai darme um numero fraccionário, como o converto em horas de modo a aparecer 10h30?

Link to comment
Share on other sites

ok ja entendi a parte de inserir, so tenho duas duvidas:

1ª consigo ir a masktextbox buscar os valores em separado ir buscar o 10 aos primeiros espaços e depois o 30?

2ª ok adiciono, somo os campos todos correspondentes a maquina X, vai darme um numero fraccionário, como o converto em horas de modo a aparecer 10h30?

1º Parsing 😛

        MaskedTextBox1.Mask = "##h##"
        MaskedTextBox1.Text = "1051"
        Dim Tempo() As String = Split(MaskedTextBox1.Text, "h")
        MsgBox("Horas: " & Tempo(0) & "  -  Minutos: " & Tempo(1))

2º É uma questão de separares a parte inteira da decimal.

A parte inteira representam as horas. A parte decimal representa os minutos na relação de 60 minutos por unidade.

Por exemplo:

        Dim hora As Double = 10.7
        Dim Horas As Integer = Math.Floor(hora)
        Dim Minutos As Integer = CInt((hora - Horas) * 59)

Para a variável Horas passamos um Floor na hora decimal, o que vai devolver neste caso 10, pois é sua função devolver o inteiro mais próximo, para baixo.

Na variável Minutos, extraímos o valor decimal subtraíndo a parte inteira do número completo. Obtemos neste caso 0,7. Depois basta multiplicares por o valor máximo, que é 59 e obtens o valor em minutos a 70% da hora, ou seja, 41 minutos.

Se quisesses acrescentar segundos e até milisegundos, bastava aproveitar as casas decimais dos resultados consequentes, por exemplo:

0.7*59 é 41,3, o que significa 41 minutos e 30% de 60 segundos.

0.71*59 é 41,89, o que significa 41 minutos e 80% de 60 segundos e 90% de um décimo de segundo

0.719*59 .......

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

1º Parsing 😄

        MaskedTextBox1.Mask = "##h##"
        MaskedTextBox1.Text = "1051"
        Dim Tempo() As String = Split(MaskedTextBox1.Text, "h")
        MsgBox("Horas: " & Tempo(0) & "  -  Minutos: " & Tempo(1))

2º É uma questão de separares a parte inteira da decimal.

A parte inteira representam as horas. A parte decimal representa os minutos na relação de 60 minutos por unidade.

Por exemplo:

        Dim hora As Double = 10.7
        Dim Horas As Integer = Math.Floor(hora)
        Dim Minutos As Integer = CInt((hora - Horas) * 59)

Para a variável Horas passamos um Floor na hora decimal, o que vai devolver neste caso 10, pois é sua função devolver o inteiro mais próximo, para baixo.

Na variável Minutos, extraímos o valor decimal subtraíndo a parte inteira do número completo. Obtemos neste caso 0,7. Depois basta multiplicares por o valor máximo, que é 59 e obtens o valor em minutos a 70% da hora, ou seja, 41 minutos.

Se quisesses acrescentar segundos e até milisegundos, bastava aproveitar as casas decimais dos resultados consequentes, por exemplo:

0.7*59 é 41,3, o que significa 41 minutos e 30% de 60 segundos.

0.71*59 é 41,89, o que significa 41 minutos e 80% de 60 segundos e 90% de um décimo de segundo

0.719*59 .......

Tudo esmiuçadinho, compreendi na perfeição 😛

Obrigado pela ajuda

Link to comment
Share on other sites

So uma outra hipotese, que no fundo vai dar "quase ao mesmo".

Eu consideraria a hipotese de guardar os dados como um campo long, guardando os dados como ticks.

1 tick = 100 nanosegundos

Se precisar apenas de segundos basta dividir por 10.000.000.

Quanto a codigo o exemplo da propria microsoft é esclarecedor:

        Dim centuryBegin As Date = #1/1/2001#
        Dim currentDate As Date = Date.Now
        Dim elapsedTicks As Long = currentDate.Ticks - centuryBegin.Ticks
        Dim elapsedSpan As New TimeSpan(elapsedTicks)

        Debug.WriteLine(String.Format("Elapsed from the beginning of the century to {0:f}:", currentDate))
        Debug.WriteLine(String.Format("   {0:N0} nanoseconds", elapsedTicks * 100))
        Debug.WriteLine(String.Format("   {0:N0} ticks", elapsedTicks))
        Debug.WriteLine(String.Format("   {0:N2} seconds", elapsedSpan.TotalSeconds))
        Debug.WriteLine(String.Format("   {0:N2} minutes", elapsedSpan.TotalMinutes))
        Debug.WriteLine(String.Format("   {0:N0} days, {1} hours, {2} minutes, {3} seconds", _
                          elapsedSpan.Days, elapsedSpan.Hours, _
                          elapsedSpan.Minutes, elapsedSpan.Seconds))
Link to comment
Share on other sites

Para este caso parece-me até que os minutos apenas eram suficientes.

Só recomendei os valores decimais porque percebi que é uma permanente soma de horas.

Estás a imaginar umas 2000 horas em ticks, não estás ? 😄

Seria talvez um peso desnecessário.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

Para este caso parece-me até que os minutos apenas eram suficientes.

Só recomendei os valores decimais porque percebi que é uma permanente soma de horas.

Estás a imaginar umas 2000 horas em ticks, não estás ? 😄

Seria talvez um peso desnecessário.

Sim os minutos é suficiente...

ja agora uma ultima ajuda xD

no campo SQL coloque do tipo decimal(18, 0), mas quando adiciono um valor e mostro na gridview 10,5 da 11 e nao consigo por a mostrar duas casas decimais de maneira nenhuma...a mesma função que returna o valor que insiro na base de dados numa msgbox mostra 10,5 por isso penso que o problema e mesmo na bae de dados que aredonda 

Link to comment
Share on other sites

Isso é outra pergunta completamente diferente que merece um tópico pois pode acontecer a mais alguém e não precisa de estar escondida numa descrição como "adicionar horas à base de dados e depois somar".

Abre, por favor, um tópico dedicado.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

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
×
×
  • 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.