• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

passado

adicionar horas á base de dados SQL e depois somar

19 mensagens neste tópico

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

estou a perceber, e dizme só uma coisa eu consigo por exemplo o utilizador coloca 10h30 numa textboxmask com guardo na BD?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É uma máscara para 1030 ?

Se tiveres forma de individualizar o 10 do 30, torna-se mito mais simples.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

Percebi tudo menos o passar as horas "as is"  xD

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tal e qual como estão.

Se são 10 horas e 30 minutos, então armazenas 10 + ((30*1)/60)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Outra ideia é em vez de passares as horas no formato 1,5

passavas dois campos: horas->1; minutos->30

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas depois tenho de somar os dois campos e fico com o mesmo problema do resgate

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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 :P

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

1º Parsing :D

        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 :P

Obrigado pela ajuda

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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))

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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 ? :D

Seria talvez um peso desnecessário.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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 ? :D

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 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora