2011-11-23 15 views
6

¿Es posible cambiar la fecha y hora de una base de datos particular en SQL Server?¿Simula la fecha actual en una instancia de SQL Server?

¿Está relacionado con la fecha/hora del sistema operativo?

Deseamos simular una fecha futura para fines de prueba, es decir, por lo que el GETDATE() devuelve una fecha en el futuro.

Tiene que estar en un entorno de semiproducción (por etapas), por lo que, lamentablemente, cambiar la fecha/hora del sistema operativo no es una opción para nosotros.

En un mundo ideal, haríamos girar un servidor virtual, pero tampoco una opción en este momento.

Respuesta

2

Como se ha dicho, por otros, No.

Una solución muy hacky, sería la de escribir su propia función para devolver la fecha que desee y tienen que volver GETDATE() cuando haya terminado la prueba, y llame a esa función en su lugar. Probablemente exista una ligera sobrecarga al hacer esto, pero hará lo que necesita.

+0

Un punto interesante (+1 de mí), me hizo pensar si hay una forma de anular GETDATE() ... parece que podría usar la sintaxis completa dbo.GETDATE() significa cambiar mi código ... pero no sería tan malo, sin embargo, estoy ejecutando un DB de 2005 en modo compatibilty 2000, así que probablemente estoy buscando problemas con funciones determinísticas/no deterministas, etc. http: // stackoverflow .com/questions/2593047/changing-the-output-of-getdate –

+2

Por amor a todo lo que es sagrado, no llames a tu nueva función getdate. No se me ocurre una forma más fácil de generar confusión que la opción de elegir el nombre de una función incorporada para sus propios fines. Si ya está cambiando su base de código para adaptarse a su nueva función, deje en claro que está haciendo otra cosa. Demonios, MYGETDATE sería mejor. –

+0

Verdadero, buen punto. –

3

Lamentablemente, está relacionado con la fecha y hora del sistema operativo. Ver aquí: http://msdn.microsoft.com/en-us/library/ms188383.aspx

Este valor se deriva del sistema operativo del ordenador en el que la instancia de SQL Server se está ejecutando.

+0

Gracias Tiburón, +1 de mi parte Esperaba algún tipo de solución mágica ... :-) Me pregunto si existe algún script de hardcode powershell para alterar los tiempos de una ejecución/ejecución específica, ¡aunque suena casi imposible/v peligroso!Parece que tendré que buscar más en la opción de servidor virtual ... hora de EC2, creo :-) –

+1

@AlexKey No hay problema, me alegra poder ayudar. Existe un cmdlet 'Set-Date' para Powershell (http://technet.microsoft.com/en-us/library/ee176960.aspx), pero alterará la fecha y hora de su sistema operativo. –

+0

Cool, gracias por el cmdlet. –

1

Puede utilizar siempre presente y ajustar en consecuencia:

SELECT getutcdate() 

favor ver más abajo para más información StackOverflow Question

pero no hay manera de cambiar los resultados de un GETDATE() sin cambiar el servidor de fecha.


Agregado: Si lo desea, puede hacer una EXEC xp_cmdshell 'DATE 10/10/2011' ... pero no se recomienda.

+0

Hola, gracias por la respuesta, pero lamentablemente no es para ajustar una llamada en particular a GETDATE(), sino todas las llamadas a GETDATE() para que podamos probar el código existente. Para que las pruebas sean más robustas, intentamos no cambiar el código, sino modificar el entorno. Gracias de cualquier manera. –

+0

Lo siento, parece que su pregunta de SQL es SOL. :) – SQLMason

+0

punto interesante en xp_cmdshell gracias. No creo que esté habilitado en nuestro entorno de preparación, pero voy a tener en cuenta la línea de cmd, gracias. +1 de mí :-) –

0

Creo que puede crear una función de usuario que haga el cálculo por usted y lo aplique.

http://msdn.microsoft.com/en-us/library/ms186755.aspx

También, se puede usar como el valor predeterminado para una columna.

Bind a column default value to a function in SQL 2005

+0

Gracias Chris, estoy tratando de evitar cambiar mi código, pero de forma similar a la respuesta de Doozer http://stackoverflow.com/q/8246648/141022 podría ser una opción para cambiar de un lado a otro. Gracias por tu contribución. –

1

Otra solución que he tenido algo de éxito con es agregar un desencadenador INSTEAD OF a cualquier mesa en la que se inserta un valor GETDATE() y modificarlo allí por ejemplo:

ALTER TRIGGER [dbo].[AccountsPayableReceivable_trg_i] ON [dbo].[AccountsPayableReceivable] 
INSTEAD OF INSERT 
AS 
    SET NOCOUNT ON 

    SELECT * 
    INTO #tmp_ins_AccountsPayableReceivable 
    FROM INSERTED 

    UPDATE #tmp_ins_AccountsPayableReceivable 
    SET dtPaymentMade = '01-Jan-1900' 
    WHERE dtPaymentMade between dateadd(ss, -5, getdate()) and dateadd(ss, +5, getdate()) 

    INSERT INTO AccountsPayableReceivable 
    SELECT * 
    from #tmp_ins_AccountsPayableReceivable 

(Incidentalmente, la cláusula where está allí porque mi script de prueba autogenera estos desencadenantes, agregando una actualización para cada columna de fecha y hora, así que solo quiero actualizar aquellos que parecen estar siendo insertados con un valor GETDATE())

+0

¡Gran idea, estoy en un mundo diferente ahora así que no conseguiré usarlo, pero me gusta la teoría! +1 de mi parte –

Cuestiones relacionadas