Best way to store time (hh:mm) in a database

前端 未结 15 2017
面向向阳花
面向向阳花 2020-11-29 18:58

I want to store times in a database table but only need to store the hours and minutes. I know I could just use DATETIME and ignore the other components of the date, but wha

相关标签:
15条回答
  • 2020-11-29 19:15

    If you are using MySQL use a field type of TIME and the associated functionality that comes with TIME.

    00:00:00 is standard unix time format.

    If you ever have to look back and review the tables by hand, integers can be more confusing than an actual time stamp.

    0 讨论(0)
  • 2020-11-29 19:19

    You could store it as an integer of the number of minutes past midnight:

    eg.

    0 = 00:00 
    60 = 01:00
    252 = 04:12
    

    You would however need to write some code to reconstitute the time, but that shouldn't be tricky.

    0 讨论(0)
  • 2020-11-29 19:25

    Store the ticks as a long/bigint, which are currently measured in milliseconds. The updated value can be found by looking at the TimeSpan.TicksPerSecond value.

    Most databases have a DateTime type that automatically stores the time as ticks behind the scenes, but in the case of some databases e.g. SqlLite, storing ticks can be a way to store the date.

    Most languages allow the easy conversion from TicksTimeSpanTicks.

    Example

    In C# the code would be:

    long TimeAsTicks = TimeAsTimeSpan.Ticks;
    
    TimeAsTimeSpan = TimeSpan.FromTicks(TimeAsTicks);
    

    Be aware though, because in the case of SqlLite, which only offers a small number of different types, which are; INT, REAL and VARCHAR It will be necessary to store the number of ticks as a string or two INT cells combined. This is, because an INT is a 32bit signed number whereas BIGINT is a 64bit signed number.

    Note

    My personal preference however, would be to store the date and time as an ISO8601 string.

    0 讨论(0)
  • 2020-11-29 19:26

    Instead of minutes-past-midnight we store it as 24 hours clock, as an SMALLINT.

    09:12 = 912 14:15 = 1415

    when converting back to "human readable form" we just insert a colon ":" two characters from the right. Left-pad with zeros if you need to. Saves the mathematics each way, and uses a few fewer bytes (compared to varchar), plus enforces that the value is numeric (rather than alphanumeric)

    Pretty goofy though ... there should have been a TIME datatype in MS SQL for many a year already IMHO ...

    0 讨论(0)
  • 2020-11-29 19:27

    The saving of time in UTC format can help better as Kristen suggested.

    Make sure that you are using 24 hr clock because there is no meridian AM or PM be used in UTC.

    Example:

    • 4:12 AM - 0412
    • 10:12 AM - 1012
    • 2:28 PM - 1428
    • 11:56 PM - 2356

    Its still preferrable to use standard four digit format.

    0 讨论(0)
  • 2020-11-29 19:28

    SQL Server actually stores time as fractions of a day. For example, 1 whole day = value of 1. 12 hours is a value of 0.5.

    If you want to store the time value without utilizing a DATETIME type, storing the time in a decimal form would suit that need, while also making conversion to a DATETIME simple.

    For example:

    SELECT CAST(0.5 AS DATETIME)
    --1900-01-01 12:00:00.000
    

    Storing the value as a DECIMAL(9,9) would consume 5 bytes. However, if precision to not of utmost importance, a REAL would consume only 4 bytes. In either case, aggregate calculation (i.e. mean time) can be easily calculated on numeric values, but not on Data/Time types.

    0 讨论(0)
提交回复
热议问题