Eu voto para defini-lo no procedimento (ou o padrão para a coluna, para inserções). Não há razão para passar todas essas informações por todas as camadas, a menos que você precise de precisão de microssegundos para diferenciar, por exemplo, quando o usuário clicou no botão vs. quando a transação foi confirmada no banco de dados. Isso é especialmente verdadeiro se você tiver um aplicativo distribuído - você deseja confiar em todos os seus servidores da Web/aplicativos para estarem sincronizados, não importa as estações de trabalho do usuário final para aplicativos cliente/servidor? Você pode ter servidores em diferentes data centers, todos com fusos horários diferentes, alguns observando o horário de verão, outros não, etc.
DateTime.UtcNow
deve obliterar a maioria dessas diferenças, mas eu ainda voltaria a passar todos esses dados sem motivo. O banco de dados sabe que horas são; deixe que ele armazene o valor para você e mantenha toda essa lógica fora do aplicativo. (Além disso, se você estiver armazenando a hora UTC, você realmente precisa de
DATETIMEOFFSET
? Nesse caso, você ainda precisa de alguma maneira para o procedimento saber de qual fuso horário essas informações vieram. Caso contrário, você provavelmente deve usar SMALLDATETIME/DATETIME/DATETIME2
dependendo da precisão necessária.)