2011-11-23 18 views
6

是否可以更改SQL Server上特定數據庫的日期時間?在SQL Server實例上模擬當前日期?

是否與操作系統的日期/時間綁定?

我們希望模擬未來的日期時間用於測試目的,即GETDATE()將在未來返回日期。

它一定是在一個半停產(分段)環境,讓不幸的是更改操作系統日期/時間不是我們的選擇。

在一個理想的世界裏,我們會啓動一個虛擬服務器,但目前也不是真正的選擇。

回答

2

如前所述,被別人號

一個真正哈克的解決辦法,將是寫自己的函數來返回你想要的日期,並使其返回GETDATE()你做測試時,和調用該函數。這樣做可能會有一些小的開銷,但它會做你所需要的。

+0

有趣的點(從我+1),讓我想如果有重寫GETDATE()的方式...看起來像我可以使用完整的語法dbo.GETDATE()它這意味着改變我的代碼......但不會太糟糕,但是我在2000年的兼容性模式下運行的2005年數據庫,所以我可能要求確定性/非確定性函數等問題。http:// stackoverflow .com/questions/2593047 /改變輸出的getdate –

+2

對於所有神聖的愛,請不要叫你的新函數getdate。我想不出一個更容易產生混淆的方法,而不是爲了您自己的目的而選擇內置函數的名稱。如果您已經在更改您的代碼庫以適應您的新功能,請明確表示它正在執行其他操作。地獄,MYGETDATE會更好。 –

+0

確實很好。 –

3

不幸的是它與OS日期和時間有關。在這裏看到:http://msdn.microsoft.com/en-us/library/ms188383.aspx

該值從計算機上 操作系統的SQL Server實例正在運行的導出。

+0

謝謝鯊魚,從我+1。我希望的某種神奇的解決辦法的... :-)我不知道是否有用於更改日期時間爲一個特定的EXE /線程任何硬編碼PowerShell腳本 - 儘管這聽起來很危險幾乎是不可能的/ V!看起來我將不得不進一步深入虛擬服務器選項..... EC2的時間我認爲:-) –

+1

@AlexKey沒問題,很樂意提供幫助。 Powershell有一個'Set-Date' cmdlet(http://technet.microsoft.com/en-us/library/ee176960.aspx),但它會改變你的操作系統日期和時間。 – 2011-11-23 18:37:11

+0

酷,謝謝你的cmdlet。 –

1

您可以隨時使用,並相應調整:

SELECT getutcdate() 

請參見下面的更多信息 StackOverflow Question

但有沒有辦法改變從GETDATE()結果不改變服務器日期。


加: 如果您願意,您可以做 EXEC xp_cmdshell 'DATE 10/10/2011' ...但不建議。

+0

嗨,感謝您的迴應,但不幸的是,它不是調整GETDATE()的特定調用,而是調用所有對GETDATE()的調用,以便我們可以測試現有代碼。爲了使測試更健壯,我們試圖不改變代碼,而是調整環境。不管怎麼說,還是要謝謝你。 –

+0

對不起,你的SQL問題似乎是SOL。 :) – SQLMason

+0

感謝xp_cmdshell有趣的一點。我認爲它不在我們的分段環境中啓用,但我會記住cmd行,謝謝。 +1從我:-) –

1

另一個解決方法我已經有一些成功的是INSTEAD OF觸發器添加到被插入一個GETDATE()值的任何表並修改它還有如:

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 

(順便說一句,在where子句是存在的,因爲我的測試腳本自動生成這些觸發器,添加了對每一個datetime列的更新,所以我只想更新那些看起來像他們被插入了GETDATE()值。)

+0

好主意,我現在處於一個不同的世界,所以不會使用它,但我喜歡理論!從我+1。 –

相關問題