tipo texto numero ejemplo dato convertir convert cast sql sql-server casting int varchar

sql - texto - ¿Cómo agrego duración a la cadena de formato hhmm y la vuelvo a convertir a cadena?



convertir texto a numero sql (4)

Tengo dos columnas en una tabla que deben agregarse juntas. Uno de ellos es un varchar (4) con tiempo militar, menos el colon, incluidos los anteriores 0s. Otro es un int que describe la duración de una cita en minutos. Básicamente, necesito agregar los dos juntos y mantenerlo como varchar (4), todo en el mismo formato que la primera columna. He usado SQL anteriormente, pero no de manera sofisticada. ¿Cuál sería el enfoque correcto para esto? ¡Gracias!

No tengo que preocuparme de que las cosas pasen al día siguiente.

Por ejemplo:

time: ''1145'' duration: 45 sum: ''1230'' time: ''0915'' duration: 30 sum: ''0945'' (not ''945'')


Es realmente feo pero te da el resultado que deseas:

create table #temp ( militarytime varchar(4), duration int ) insert into #temp values(''1410'', 10) insert into #temp values(''0415'', 5) insert into #temp values(''1145'', 45) insert into #temp values(''0915'', 30) select left(replace(convert(varchar, dateadd(mi, duration, convert(datetime, convert(datetime, replace(militarytime, right(militarytime,2), '':'' + right(militarytime,2))))), 114), '':'', ''''), 4) from #temp drop table #temp Results: 1420 0420 1230 0945

CAVEAT, probablemente hay mejores formas, solo muestra otra opción.


La suposición es que la pregunta establece que el tiempo siempre estará en formato de 4 dígitos hhmm. La consulta extrae hh y mm de la cadena y convierte a tiempo. La duración en minutos se agrega a este valor de tiempo y luego se vuelve a convertir al formato de cadena hh: mm usando la función CONVERTIR y los dos puntos se eliminan de la cadena para volver al formato original.

Haga clic aquí para ver la demostración en SQL Fiddle.

Guión :

CREATE TABLE timevalues ( timestring VARCHAR(20) NOT NULL , duration INT NOT NULL ); INSERT INTO timevalues (timestring, duration) VALUES (''1145'', 30), (''2345'', 25), (''0815'', 125); SELECT timestring , duration , REPLACE(CONVERT(VARCHAR(5), DATEVALUE, 108), '':'', '''') AS newtimevalue FROM ( SELECT timestring , duration , DATEADD(MINUTE, duration, CAST( ( SUBSTRING(timestring, 1, 2) + '':'' + SUBSTRING(timestring, 3, 2) ) AS DATETIME ) ) AS DATEVALUE FROM timevalues ) T1;

Salida :

timestring duration newtimevalue ---------- -------- ------------- 1145 30 1215 2345 25 0010 0815 125 1020


No tengo idea de por qué tendrías que hacer esto exactamente de esta manera.

Personalmente, mantendría los tipos de datos como lo que produce un comportamiento natural en SQL-Server. Me ocuparía del formateo en el cliente o en cualquier lugar fuera de la capa de la base de datos. Mantenga las consideraciones de presentación lejos de las consideraciones de datos;)

Dicho esto, siento que he cumplido con mi deber de hacer del universo un lugar mejor, ¡y ahora puedo volver a contaminarlo con lo que realmente deseas de nosotros!

REPLACE( CONVERT( VARCHAR(5), DATEADD( MINUTE, [duration], CAST(LEFT([time], 2) + '':'' + RIGHT([time], 2) AS DATETIME) ), 8 ), '':'', '''' )


Select left(New_Time,2)+RIGHT(New_Time,2) from ( Select LEFT( cast(CONVERT ( time , dateadd(minute, duration, --Dateadd will add the minutes to the time given. Cast(LEFT(mil_time,2)+'':''+Right(mil_time,2) as time) --This transforms the varchar into a Time format SQL recognizes. ), 8) as varchar),5) as New_Time from ( select ''2145'' as mil_time, 200 as duration --This is the original data. ) Orig_tbl ) Time_Format