2010-11-22 18 views
6

Con SQL Server 2008, el tipo de datos time tiene un argumento de precisión opcional (el valor predeterminado es 7). Con esto puedes controlar la cantidad de decimales fraccionarios que se almacenan y muestran.¿Puede la precisión de SQL Server 2008 TIME reducirse a solo horas y minutos?

DECLARE @time time(3) 
SET @time = GETDATE() 
PRINT @time 

Lo anterior se imprimiría esto,

10:47:25.347 

La documentación dice la precisión es más pequeño time(0). Esto almacenaría e imprimiría 10:47:25.

¿Es posible reducir la precisión aún más, para eliminar/poner a cero segundos: 10:47?

Sé que esto se puede hacer manualmente agregando una restricción (DATEPART(seconds, @time) = 0), realizando operaciones matemáticas en la entrada de datos para poner a cero los segundos y formateando manualmente al imprimir, pero estoy buscando una manera más simple de definir un campo en una tabla como "horas y minutos", del mismo modo que el tipo date le permite definir un campo como "solo la fecha, sin componente de tiempo".

Respuesta

4

No. No es posible reducir la precisión del tipo de datos time más allá de time(0)

1
SET @time = convert(varchar(5),getdate(),8) 

Aquí está echando el resultado de GETDATE a un VARCHAR y formatearlo con el modifier 8 que significa tiempo formato.

EDITAR: Esto te está dando una cadena, tal vez no sea el resultado que estás buscando.

Atentamente.

1

Si el intervalo que desea es uno de los intervalos reconocidos de SQL Server (Minuto, Hora, Día, etc.), otra opción que puede considerar, es que defina su propio tipo de datos, (digamos que quiere horas) a continuación, almacenar como un número entero que es sólo un número hora absoluta , a partir de un tiempo de referencia base (o utilizar el mismo tiempo de referencia de base que utiliza SQL Server (medianoche 1 ene 1900)

convertir del almacenado valor entero, (@IntVal), a la hora actual como fecha y hora, (@realDT) usando la siguiente. (suponiendo @baseDatetime se define como el tiempo base de

Declare @baseDatetime smalldatetime 
Set @baseDatetime = 0 -- for 1 Jan 1900, or 
Set @baseDatetime = 'd Month yyyy' for some other base 

@realDT->@IntVal: @IntVal = DateDiff(hour, @baseDatetime, @realDT) 
@IntVal->@realDT: @realDT = DateAdd(hour, @IntVal, @baseDatetime) 
2

Utilice smalldatetime e ignore el bit de fecha (será 01 Jan 1900). Tiene precisión minuciosa.

Tan útil como es el tiempo, así es como lo hacíamos en los viejos tiempos (SQL Server 2005 y antes :-)

Cuestiones relacionadas