español - TSQL Default DateTime mínimo
set dateformat sql server (7)
"Tal vez debería dejarlo nulo"
No use números mágicos, es una mala práctica, si no tiene un valor, déjelo nulo
De lo contrario, si realmente desea una fecha predeterminada, use una de las otras técnicas publicadas para establecer una fecha predeterminada
Usando Transact SQL, ¿hay una manera de especificar una fecha y hora predeterminada en una columna (en la declaración de creación de la tabla) de manera que la fecha y hora sea el valor mínimo posible para los valores de la hora?
create table atable ( atableID int IDENTITY(1, 1) PRIMARY KEY CLUSTERED, Modified datetime DEFAULT XXXXX?????? )
Tal vez debería dejarlo nulo.
A menos que esté haciendo una base de datos para rastrear tiempos históricos hace más de un siglo, usando
Modified datetime DEFAULT ((0))
es perfectamente seguro y sólido y permite consultas más elegantes que ''1753-01-01'' y consultas más eficientes que NULL
.
Sin embargo, dado que la primera datetime
modificación es la hora en que se insertó el registro, puede utilizar:
Modified datetime NOT NULL DEFAULT (GETUTCDATE())
lo que evita todo el problema y hace que sus inserciones sean más fáciles y seguras, ya que no se inserta en absoluto y SQL hace el trabajo de casa :-)
Con eso en su lugar, aún puede tener consultas elegantes y rápidas utilizando 0 como mínimo práctico, ya que se garantiza que siempre será inferior a cualquier GETUTCDATE()
generado por GETUTCDATE()
.
A veces, hereda un código frágil que ya está esperando valores mágicos en muchos lugares. Todo el mundo tiene razón, debes usar NULL si es posible. Sin embargo, como método abreviado para asegurar que todas las referencias a ese valor sean iguales, me gusta poner "constantes" (por falta de un nombre mejor) en SQL en una función de escalado y luego llamar a esa función cuando necesito el valor. De esa manera, si alguna vez quiero actualizarlos todos para que sean otra cosa, puedo hacerlo fácilmente. O si quiero cambiar el valor predeterminado en el futuro, solo tengo un lugar para actualizarlo.
El siguiente código crea la función y una tabla que lo usa para el valor predeterminado de DateTime. Luego inserta y selecciona de la tabla sin especificar el valor para Modificado. Luego se limpia después de sí mismo. Espero que esto ayude.
-- CREATE FUNCTION
CREATE FUNCTION dbo.DateTime_MinValue ( )
RETURNS DATETIME
AS
BEGIN
DECLARE @dateTime_min DATETIME ;
SET @dateTime_min = ''1/1/1753 12:00:00 AM''
RETURN @dateTime_min ;
END ;
GO
-- CREATE TABLE USING FUNCTION FOR DEFAULT
CREATE TABLE TestTable
(
TestTableId INT IDENTITY(1, 1)
PRIMARY KEY CLUSTERED ,
Value VARCHAR(50) ,
Modified DATETIME DEFAULT dbo.DateTime_MinValue()
) ;
-- INSERT VALUE INTO TABLE
INSERT INTO TestTable
( Value )
VALUES ( ''Value'' ) ;
-- SELECT FROM TABLE
SELECT TestTableId ,
VALUE ,
Modified
FROM TestTable ;
-- CLEANUP YOUR DB
DROP TABLE TestTable ;
DROP FUNCTION dbo.DateTime_MinValue ;
Creo que esto funcionaría ...
create table atable
(
atableID int IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
Modified datetime DEFAULT ((0))
)
Edición: esto es incorrecto ... El valor mínimo de fecha y hora de SQL es 1/1/1753. Mi solución proporciona un datetime = 1/1/1900 00:00:00. Otras respuestas tienen la fecha mínima correcta ...
Creo que tu única opción aquí es una constante. Con eso dicho, no lo uses, quédate con nulos en lugar de fechas falsas.
create table atable
(
atableID int IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
Modified datetime DEFAULT ''1/1/1753''
)
Estoy de acuerdo con el sentimiento en "no usar valores mágicos". Pero me gustaría señalar que hay ocasiones en que es legítimo recurrir a tales soluciones.
Hay un precio que pagar para configurar las columnas que admiten nulos: los valores NULL no son indexables. Una consulta como "obtener todos los registros que no se han modificado desde el inicio de 2010" incluye aquellos que nunca se han modificado. Si usamos una columna anulable, nos vemos obligados a usar [modified] <@cutoffDate O [modified] IS NULL , y esto a su vez obliga al motor de la base de datos a realizar un escaneo de tablas, ya que los nulos no están indexados. Y esto último puede ser un problema.
En la práctica, uno debe ir con NULL si esto no introduce una penalización de rendimiento práctica y en el mundo real. Pero puede ser difícil saberlo, a menos que tenga alguna idea de qué volúmenes de datos realistas son hoy y estarán en el futuro que se espera. También debe saber si habrá una gran proporción de los registros que tengan un valor especial; si es así, no tiene sentido indizarlo de todos modos.
En resumen, por sordos / regla general, uno debe ir por NULL. Pero si hay una gran cantidad de registros, los datos se consultan con frecuencia y solo una pequeña proporción de los registros tienen el valor NULL / especial, podría haber una ganancia de rendimiento significativa para ubicar registros basados en esta información (siempre que, por supuesto, uno cree el índice!) y en mi humilde opinión esto a veces puede justificar el uso de valores "mágicos".
Por lo que yo sé, no existe ninguna función para devolver esto, tendrá que configurarlo de manera difícil.
Intentar convertir desde valores como 0 para obtener una fecha mínima se establecerá de forma predeterminada en 01-01-1900.
Como se sugirió anteriormente, lo mejor es dejarlo en NULL (y use ISNULL cuando lea si lo necesita), o si le preocupa configurarlo correctamente, incluso podría establecer un disparador en la tabla para establecer la fecha de modificación en las ediciones.
Si tiene el corazón puesto en obtener la fecha mínima posible, entonces:
create table atable ( atableID int IDENTITY(1, 1) PRIMARY KEY CLUSTERED, Modified datetime DEFAULT ''1753-01-01'' )