Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to deal with time storage in SQL

Tags:

c#

sql

time

I have a web application that I'm writing (C#, MSSQL) and I need to store the timestamp when a record is stored in the system. Normally, I would just do this with SQL and the DATETIME function. However, the server is located in a different time zone than our company is located... AND we may change to another server in completely different time zone. The hosting company will not change the server time to match our local time zone. (Not that I blame them, but it was one thing I tried.)

So, my question is, what is the best way to store the date/time of the record update and what is the best way to present that date/time back to the user in our local time zone?

I want the least messy way of doing this, so a combo of C# and SQL would be fine as long as the solution is easy to implement. (My normal style is to do more work in stored procedures and less in C#, if that matters.)

Can you show me some sample code? Thanks!

like image 564
BoltBait Avatar asked Oct 21 '08 00:10

BoltBait


2 Answers

always store DATETIME data in Universal Time Coordinated (UTC aka GMT)

  • this avoids all timezone issues
  • this avoids daylight-savings-time issues
  • this allows simple date math to always work
  • this allows transactions in different time zones to stay in synch
  • this allows you to move the data to a different server in a different time zone and not screw everything up
  • etc. "Universal" time, make sense?

C# DateTime provides DateTime.UtcNow and ToLocalTime(), SQL provides GETUTCDATE(). Here's a SQL function to convert UTC to local time -

-- convert UTC to local time
create FUNCTION [dbo].[udfUtcToLocalTime]
(
    @gmt datetime
)
RETURNS datetime
AS
BEGIN
    DECLARE @dt datetime
    SELECT 
        @dt = dateadd(millisecond,datediff(millisecond,getutcdate(), getdate()),@gmt)
    RETURN @dt
END

example:

SELECT dbo.udfUtcToLocalTime(someDateTimeField)
FROM someTable
like image 52
Steven A. Lowe Avatar answered Oct 09 '22 07:10

Steven A. Lowe


Save UTC times in your database and localize those times every time you wanna show them to a user

like image 41
sebagomez Avatar answered Oct 09 '22 06:10

sebagomez