Provide DATETIME-returning functions that return a date and time that is the same throughout the transaction. In the case that the transaction is under the SNAPSHOT isolation level, the DATETIME should equal the date and time when the snapshot was "taken", which must also be greater than or equal to the date and time when BEGIN TRANSACTION was executed. For other isolation levels, handle this in whatever way makes sense.
AFAIK, there is currently no way to get the date and time of the current snapshot.
--- Added the following on 9/5/2008 and reopened:
The workaround suggested by Microsoft does not work well because:
(1) It requires the server permission "VIEW SERVER STATE", which is too severe. Moreover, this cannot be easily worked around due to the fact that this is a server-level permission. (EXECUTE AS could be used, but since it would require a LOGIN not a USER, this is especially inconvenient.)
(2) It does not return a UTC date. It is not possible to convert it to a UTC date and time that would be guaranteed to be correct; when the transaction occurs during the DST repeated hour it is impossible to tell whether the transaction started during standard or daylight time because the returned value is identical in both hours. UTC time is important to applications that have standardized on storing all dates and times in UTC.
Note that it is actually a common misconception that GETDATE()/GETUTCDATE() return the transaction time and date -- especially users coming from other database systems that use snapshots. Functions for returning this information can help these users and help in porting applications from other database systems.