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