2011-11-23 39 views
6

Có thể thay đổi ngày giờ cho một cơ sở dữ liệu cụ thể trên SQL Server không?Mô phỏng ngày hiện tại trên phiên bản SQL Server?

Được liên kết với ngày/giờ của hệ điều hành?

Chúng tôi muốn mô phỏng một ngày giờ trong tương lai cho mục đích thử nghiệm, tức là GETDATE() trả về một ngày trong tương lai.

Nó phải ở trong một môi trường bán sản xuất (dàn dựng) nên tiếc là thay đổi ngày/giờ của hệ điều hành không phải là một lựa chọn cho chúng tôi.

Trong một thế giới lý tưởng, chúng tôi sẽ quay lên một máy chủ ảo, nhưng cũng không thực sự là một tùy chọn vào lúc này.

Trả lời

2

Như đã trình bày, bởi những người khác, số

Một cách giải quyết thực sự hacky, sẽ được để viết chức năng riêng của bạn để trả lại ngày bạn muốn và có nó trở GETDATE() khi bạn đã hoàn tất thử nghiệm, và gọi hàm đó thay thế. Có lẽ có một số chi phí nhỏ trong việc làm điều này, nhưng nó sẽ làm những gì bạn cần.

+0

Điểm thú vị (+1 từ tôi), khiến tôi suy nghĩ nếu có cách ghi đè GETDATE() ... có vẻ như tôi có thể sử dụng cú pháp đầy đủ dbo.GETDATE() nó có nghĩa là thay đổi mã của tôi ... nhưng sẽ không quá xấu, tuy nhiên tôi đang chạy trên một DB 2005 dưới 2000 chế độ compatibilty vì vậy tôi có thể yêu cầu cho các vấn đề liên quan đến xác định/không xác định chức năng vv http: // stackoverflow .com/questions/2593047/change-the-output-of-getdate –

+2

Vì tình yêu của tất cả những điều đó là thánh thiện, xin đừng gọi hàm mới của bạn là getdate. Tôi không thể nghĩ ra một cách dễ dàng hơn để tạo ra sự nhầm lẫn hơn là đồng chọn tên của một hàm dựng sẵn cho các mục đích của riêng bạn. Nếu bạn đã thay đổi codebase của bạn để thích ứng với chức năng mới của bạn, hãy làm cho nó rõ ràng rằng nó đang làm một cái gì đó khác. Địa ngục, MYGETDATE sẽ tốt hơn. –

+0

Đúng, điểm tốt. –

3

Thật không may, nó được gắn với ngày và giờ hệ điều hành. Xem tại đây: http://msdn.microsoft.com/en-us/library/ms188383.aspx

Giá trị này bắt nguồn từ hệ điều hành của máy tính trên mà phiên bản SQL Server đang chạy.

+0

Cảm ơn Shark, 1 từ tôi. Tôi đã hy vọng cho một số loại workaround huyền diệu ... :-) Tôi tự hỏi nếu có bất kỳ kịch bản PowerShell hardhell ​​để thay đổi ngày giờ cho một exe/thread cụ thể - mặc dù âm thanh gần không thể/v nguy hiểm!Có vẻ như tôi sẽ phải nhìn xa hơn vào tùy chọn máy chủ ảo ..... thời gian cho EC2 Tôi nghĩ :-) –

+1

@AlexKey Không sao, vui lòng giúp đỡ. Có một lệnh ghép ngắn 'Set-Date' cho Powershell (http://technet.microsoft.com/en-us/library/ee176960.aspx), nhưng nó sẽ thay đổi ngày giờ hệ điều hành của bạn. –

+0

Tuyệt vời, cảm ơn cmdlet. –

1

Bạn luôn có thể sử dụng điều này và điều chỉnh cho phù hợp:

SELECT getutcdate() 

hãy xem dưới đây để biết thêm thông tin StackOverflow Question

Nhưng không có cách nào để thay đổi các kết quả từ một GETDATE() mà không thay đổi máy chủ ngày.


Đã thêm: Bạn có thể thực hiện EXEC xp_cmdshell 'DATE 10/10/2011' nếu muốn ... nhưng không được thông báo.

+0

Xin chào, cảm ơn vì phản hồi, nhưng tiếc là không phải để điều chỉnh một cuộc gọi cụ thể tới GETDATE(), mà thay vào đó là tất cả các cuộc gọi đến GETDATE() để chúng tôi có thể kiểm tra mã hiện có. Để làm cho các bài kiểm tra mạnh mẽ hơn, chúng tôi đang cố gắng không thay đổi mã, nhưng thay vì điều chỉnh môi trường. Dù sao cũng cảm ơn bạn. –

+0

Xin lỗi, có vẻ câu hỏi SQL của bạn là SOL. :) – SQLMason

+0

Điểm thú vị trên xp_cmdshell cảm ơn. Tôi không nghĩ rằng nó được kích hoạt trên môi trường dàn dựng của chúng tôi, nhưng tôi sẽ giữ cho dòng cmd trong tâm trí, cảm ơn. +1 từ tôi :-) –

0

Tôi tin rằng bạn có thể tạo chức năng người dùng sẽ thực hiện phép tính cho bạn và áp dụng điều đó.

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

Ngoài ra, nó có thể được sử dụng như là giá trị mặc định cho một cột.

Bind a column default value to a function in SQL 2005

+0

Cảm ơn Chris, tôi đang cố gắng tránh thay đổi mã của mình, nhưng mô phỏng câu trả lời của Doozer http://stackoverflow.com/q/8246648/141022 nó có thể là một tùy chọn để chuyển đổi qua lại. Cảm ơn vì đầu vào của bạn. –

1

workaround Một Tôi đã có một số thành công với là thêm một THAY kích hoạt để bất kỳ bàn nơi một giá trị GETDATE() đã được chèn vào và sửa đổi nó có ví dụ:

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 

(Ngẫu nhiên, mệnh đề where có ở đó vì kịch bản thử nghiệm của tôi tự động tạo các trigger này, thêm một cập nhật cho mỗi cột datetime, vì vậy tôi chỉ muốn cập nhật những cái trông giống như chúng được chèn vào với một giá trị GETDATE().)

+0

Ý tưởng tuyệt vời, bây giờ tôi đang ở một thế giới khác, vì vậy tôi sẽ không sử dụng nó, nhưng tôi thích lý thuyết! +1 từ tôi. –

Các vấn đề liên quan