Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Inside

Somar horas com Sum

Recommended Posts

Caros amigos,


alguém sabe me dizer porque isso aqui não funciona corretamente?

sql = "SELECT sum(((Hour(horas)*60)+(Minute(horas)))/60) AS SomaHora FROM form_apontamento WHERE cliente = "& id &" and dia = "& dia &""
set rs = conn_p.execute(sql)

response.write rs("SomaHora")

Só há 2 valores no banco pela consulta:

8:00
5:30

O código acima mostra: 13:50

Mas deveria apresentar: 13:30

Alguém pode ajudar?


Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use dateadd

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro Lukas

 

Parece que o código que você passou faz a soma mas não entendi como mostrar o resultado para isso:

SELECT CONVERT (VARCHAR, SUM (CONVERT (INT, LEFT (HORA, 2))) + (((SUM (CONVERT (INT, RIGHT (HORA, 2)))) - (SUM (CONVERT (INT, RIGHT (HORA, 2))) % 60)) / 60)) + ':' + CONVERT (VARCHAR, SUM (CONVERT (INT, RIGHT (HORA, 2))) % 60) FROM TABELA

No meu código uso:

 

response.write rs("SomaHora")

 

Mas nesse código acima uso o que?

 

 

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

tem usar DATEADD()

Compartilhar este post


Link para o post
Compartilhar em outros sites

queria muito entender esse assunto, parece tao complicado, é dificil ???

Compartilhar este post


Link para o post
Compartilhar em outros sites

DATEADD

Retorna uma date especificada com o intervalo number especificado (inteiro assinado) adicionado à datepart especificada dessa date.

 

DATEADD (datepart , number , date )
datepart

É a parte de date para a qual um integernumber é adicionado. A tabela a seguir lista todos os argumentos datepart válidos. Equivalentes de variável definidos pelo usuário não são válidos.

datepart

Abreviações

year

yy , yyyy

quarter

qq , q

month

mm , m

dayofyear

dy , y

day

dd , d

week

wk , ww

weekday

dw , w

hour

hh

minute

mi , n

second

ss , s

millisecond

ms

microsecond

mcs

nanosecond

ns

number

É uma expressão que pode ser resolvida para um int que é adicionado à datepart da date. Variáveis definidas pelo usuário são válidas.

Se você especificar um valor com uma fração decimal, a fração será truncada e não arredondada.

date

É uma expressão que pode ser resolvida para um valor de time, date, smalldatetime, datetime, datetime2 ou datetimeoffset. date pode ser uma expressão, expressão de coluna, variável definida pelo usuário ou literal de cadeia de caracteres. Se a expressão for uma cadeia de caracteres literal, deverá ser resolvido como um datetime. Para evitar ambiguidade, quatro dígitos para o ano.

O tipo de dados de retorno é o tipo de dados do argumento date, com exceção de literais de cadeia de caracteres.

O tipo de dados de retorno para um literal de cadeia de caracteres é datetime. Um erro será gerado se a escala de segundos do literal de cadeia de caracteres tiver mais de três posições ( nnn) ou contiver a parte de deslocamento do fuso horário.

dayofyear , day e weekday retornam o mesmo valor.

Cada datepart e suas abreviações retornam o mesmo valor.

Se datepart for month e o mês date tiver mais dias que o mês de retorno e o dia date não existir no mês de retorno, o último dia do mês de retorno será retornado. Por exemplo, setembro tem 30 dias; então, as duas instruções a seguir retornam 2006-09-30 00:00:00.000:

 

SELECT DATEADD(month, 1, '2006-08-30');

SELECT DATEADD(month, 1, '2006-08-31');

 

O argumento number não pode exceder o intervalo de int. Nas instruções a seguir, o argumento de number excede o intervalo de int em 1. A mensagem de erro a seguir será retornada: "Msg 8115, Level 16, State 2, Line 1. Arithmetic overflow error converting expression to data type int."

SELECT DATEADD(year,2147483648, '2006-07-31');SELECT DATEADD(year,-2147483649, '2006-07-31');

O argumento date não pode ser incrementado em um valor fora do intervalo de seu tipo de dados. Nas instruções a seguir, o valor number adicionado ao valor date excede o intervalo do tipo de dados date. A mensagem de erro a seguir será retornada: "Msg 517, Level 16, State 1, Line 1 Adding a value to a 'datetime' column caused overflow."

SELECT DATEADD(year,2147483647, '2006-07-31');SELECT DATEADD(year,-2147483647, '2006-07-31');

A segunda parte de um valor smalldatetime é sempre 00. Se date for smalldatetime, o seguinte se aplicará:

  • Se datepart for second e number estiver entre -30 e +29, nenhum acréscimo será executado.

  • Se datepart for second e number for inferior a -30 ou superior a +29, o acréscimo será executado iniciando em um minuto.

  • Se datepart for millisecond e number estiver entre -30001 e +29998, nenhum acréscimo será executado.

  • Se datepart for millisecond e number for inferior a -30001 ou superior a +29998, o acréscimo será executado iniciando em um minuto.

DATEADD pode ser usado na <lista> SELECT, cláusulas WHERE, HAVING, GROUP BY e ORDER BY.

Precisão de frações de segundo

A adição de um datepart de microsecond ou nanosecond para tipos de dados date, smalldatetime, date e datetime não é permitida.

Os milissegundos têm uma escala de 3 (0,123). Os microssegundos têm uma escala de 6 (0,123456). Os nanossegundos têm uma escala de 9 (0,123456789). Os tipos de dados time, datetime2 e datetimeoffset têm uma escala máxima de 7 (0,1234567). Se datepart for nanosecond, number deve ser 100 antes das frações de segundo de aumento de date. Um number entre 1 e 49 será arredondado para 0 e um número de 50 a 99 será arredondado para 100.

As instruções a seguir adicionam um datepart de millisecond, microsecondou nanosecond.

DECLARE @datetime2 datetime2 = '2007-01-01 13:10:10.1111111';SELECT '1 millisecond', DATEADD(millisecond,1,@datetime2)UNION ALLSELECT '2 milliseconds', DATEADD(millisecond,2,@datetime2)UNION ALLSELECT '1 microsecond', DATEADD(microsecond,1,@datetime2)UNION ALLSELECT '2 microseconds', DATEADD(microsecond,2,@datetime2)UNION ALLSELECT '49 nanoseconds', DATEADD(nanosecond,49,@datetime2)UNION ALLSELECT '50 nanoseconds', DATEADD(nanosecond,50,@datetime2)UNION ALLSELECT '150 nanoseconds', DATEADD(nanosecond,150,@datetime2);

Aqui está o conjunto de resultados.

1 millisecond     2007-01-01 13:10:10.11211112 milliseconds    2007-01-01 13:10:10.11311111 microsecond     2007-01-01 13:10:10.11111212 microseconds    2007-01-01 13:10:10.111113149 nanoseconds    2007-01-01 13:10:10.111111150 nanoseconds    2007-01-01 13:10:10.1111112150 nanoseconds   2007-01-01 13:10:10.1111113
Deslocamento de fuso horário

Não é permitido acréscimo ao deslocamento de fuso horário.

A.Incrementando datepart em um intervalo de 1

Cada uma das instruções a seguir incrementa datepart por um intervalo de 1.

DECLARE @datetime2 datetime2 = '2007-01-01 13:10:10.1111111';SELECT 'year', DATEADD(year,1,@datetime2)UNION ALLSELECT 'quarter',DATEADD(quarter,1,@datetime2)UNION ALLSELECT 'month',DATEADD(month,1,@datetime2)UNION ALLSELECT 'dayofyear',DATEADD(dayofyear,1,@datetime2)UNION ALLSELECT 'day',DATEADD(day,1,@datetime2)UNION ALLSELECT 'week',DATEADD(week,1,@datetime2)UNION ALLSELECT 'weekday',DATEADD(weekday,1,@datetime2)UNION ALLSELECT 'hour',DATEADD(hour,1,@datetime2)UNION ALLSELECT 'minute',DATEADD(minute,1,@datetime2)UNION ALLSELECT 'second',DATEADD(second,1,@datetime2)UNION ALLSELECT 'millisecond',DATEADD(millisecond,1,@datetime2)UNION ALLSELECT 'microsecond',DATEADD(microsecond,1,@datetime2)UNION ALLSELECT 'nanosecond',DATEADD(nanosecond,1,@datetime2);

Aqui está o conjunto de resultados.

Year         2008-01-01 13:10:10.1111111quarter      2007-04-01 13:10:10.1111111month        2007-02-01 13:10:10.1111111dayofyear    2007-01-02 13:10:10.1111111day          2007-01-02 13:10:10.1111111week         2007-01-08 13:10:10.1111111weekday      2007-01-02 13:10:10.1111111hour         2007-01-01 14:10:10.1111111minute       2007-01-01 13:11:10.1111111second       2007-01-01 13:10:11.1111111millisecond  2007-01-01 13:10:10.1121111microsecond  2007-01-01 13:10:10.1111121nanosecond   2007-01-01 13:10:10.1111111
B.Incrementando mais de um nível de datepart em uma instrução

Cada uma das instruções a seguir incrementa datepart por um number grande o suficiente para também incrementar a próxima datepart superior de date.

DECLARE @datetime2 datetime2;SET @datetime2 = '2007-01-01 01:01:01.1111111';--Statement                                 Result   ------------------------------------------------------------------- SELECT DATEADD(quarter,4,@datetime2);     --2008-01-01 01:01:01.110SELECT DATEADD(month,13,@datetime2);      --2008-02-01 01:01:01.110SELECT DATEADD(dayofyear,365,@datetime2); --2008-01-01 01:01:01.110SELECT DATEADD(day,365,@datetime2);       --2008-01-01 01:01:01.110SELECT DATEADD(week,5,@datetime2);        --2007-02-05 01:01:01.110SELECT DATEADD(weekday,31,@datetime2);    --2007-02-01 01:01:01.110SELECT DATEADD(hour,23,@datetime2);       --2007-01-02 00:01:01.110SELECT DATEADD(minute,59,@datetime2);     --2007-01-01 02:00:01.110SELECT DATEADD(second,59,@datetime2);     --2007-01-01 01:02:00.110SELECT DATEADD(millisecond,1,@datetime2); --2007-01-01 01:01:01.110
C.Usando expressões como argumentos para os parâmetros de número e data

Os exemplos a seguir usam tipos diferentes de expressões como argumentos para os parâmetros number e date.

Especificando uma coluna como data

O exemplo a seguir adiciona 2 dias a cada valor na coluna OrderDate para derivar uma nova coluna chamada PromisedShipDate.

USE AdventureWorks2012;GOSELECT SalesOrderID    ,OrderDate     ,DATEADD(day,2,OrderDate) AS PromisedShipDateFROM Sales.SalesOrderHeader;

Este é um conjunto de resultados parcial.

SalesOrderID OrderDate               PromisedShipDate------------ ----------------------- -----------------------43659        2005-07-01 00:00:00.000 2005-07-03 00:00:00.00043660        2005-07-01 00:00:00.000 2005-07-03 00:00:00.00043661        2005-07-01 00:00:00.000 2005-07-03 00:00:00.000...43702        2005-07-02 00:00:00.000 2005-07-04 00:00:00.00043703        2005-07-02 00:00:00.000 2005-07-04 00:00:00.00043704        2005-07-02 00:00:00.000 2005-07-04 00:00:00.00043705        2005-07-02 00:00:00.000 2005-07-04 00:00:00.00043706        2005-07-03 00:00:00.000 2005-07-05 00:00:00.000...43711        2005-07-04 00:00:00.000 2005-07-06 00:00:00.00043712        2005-07-04 00:00:00.000 2005-07-06 00:00:00.000...43740        2005-07-11 00:00:00.000 2005-07-13 00:00:00.00043741        2005-07-12 00:00:00.000 2005-07-14 00:00:00.000
Especificando variáveis definidas pelo usuário como número e data

O exemplo a seguir especifica variáveis definidas pelo usuário como argumentos para number e date.

DECLARE @days int = 365,         @datetime datetime = '2000-01-01 01:01:01.111'; /* 2000 was a leap year */;SELECT DATEADD(day, @days, @datetime);

Aqui está o conjunto de resultados.

-----------------------2000-12-31 01:01:01.110(1 row(s) affected)
Especificando função de sistema escalar como data

O exemplo a seguir especifica SYSDATETIME para date.

SELECT DATEADD(month, 1, SYSDATETIME());

Aqui está o conjunto de resultados.

---------------------------2013-02-06 14:29:59.6727944(1 row(s) affected)
Especificando subconsultas e funções escalares como número e data

O exemplo a seguir usa subconsultas escalares, MAX(ModifiedDate), como argumentos para number e date. (SELECT TOP 1 BusinessEntityID FROM Person.Person) é um argumento artificial do parâmetro de número que mostrar como selecionar um argumento number em uma lista de valores.

USE AdventureWorks2012;GOSELECT DATEADD(month,(SELECT TOP 1 BusinessEntityID FROM Person.Person),    (SELECT MAX(ModifiedDate) FROM Person.Person));
Especificando expressões numéricas e funções de sistema escalares como número e data

O exemplo a seguir usa uma expressão numérica (-(10/2)), operadores unários (-), um operador aritmético (/) e funções de sistema escalares (SYSDATETIME) como argumentos para number e date.

SELECT DATEADD(month,-(10/2), SYSDATETIME());
Especificando funções de classificação como número

O exemplo a seguir usa uma função de classificação como argumentos para number.

USE AdventureWorks2012;GOSELECT p.FirstName, p.LastName    ,DATEADD(day,ROW_NUMBER() OVER (ORDER BY        a.PostalCode),SYSDATETIME()) AS 'Row Number'FROM Sales.SalesPerson AS s     INNER JOIN Person.Person AS p         ON s.BusinessEntityID = p.BusinessEntityID    INNER JOIN Person.Address AS a         ON a.AddressID = p.BusinessEntityIDWHERE TerritoryID IS NOT NULL     AND SalesYTD <> 0;
Especificando uma função de janela de agregação como número

O exemplo a seguir usa uma função de janela de agregação como um argumento para number.

USE AdventureWorks2012;GOSELECT SalesOrderID, ProductID, OrderQty    ,DATEADD(day,SUM(OrderQty)         OVER(PARTITION BY SalesOrderID),SYSDATETIME()) AS 'Total'FROM Sales.SalesOrderDetail WHERE SalesOrderID IN(43659,43664);GO

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.