0

我有一种情况,我希望用户能够指定一个时间范围,其中时间是给定一周中存在的相对范围。因此,用户可以选择星期一下午 5 点至星期二凌晨 1 点。可以把它想象成“一个人的轮班时间”。

我的第一反应是我可以存储“相对”时间。因此,假设一周从星期一 00:00:00 开始,星期一中午将被指示为 86400/2= 43200。我不太喜欢这种方法,因为它使处理时区有点困难。

是否有这样做的“最佳”方法(或只是一个好的方法)?MySQL 是否有某种数据类型专门处理这个问题?

我已经标记了这个“Perl”和“MySQL”,因为我将在这个应用程序中使用它们,但从技术上讲,答案不必特定于它们中的任何一个。

4

2 回答 2

0

最佳答案在一定程度上取决于您将如何处理下游数据。

但我建议避免任何黑客攻击并采取直接的方法(表语法 Sybase,因为我的 MySQL 生锈了 - 抱歉)

CREATE TABLE weekday_ranges (
    start_dow    int,  -- 0-6 or 1-7 depending on what's easier downstream 
    start_hour   int,  -- 0-23
    start_minute int,  -- 0-59
    -- Add seconds/micorseconds as needed
    end_dow      int,
    end_hour     int,
    end_minute   int
)

另一种方法是存储从周日 00:00 开始的偏移量(以秒为单位),包括开始和结束偏移量。这提供了它的好处(例如,范围比较仅仅是<>运算符而不是复杂的表达式)。

于 2012-04-08T01:28:24.583 回答
-1

将开始和结束时间分别存储在一个字段中(而不是分解为多个部分)将允许对该字段进行索引。否则,差别不大。(归根结底是选择这些部分是在 Perl 中还是在 SQL 中组合成一个值。)

确实存在一个无法解决的时区问题:在退出 DST 期间,您无法区分第一个凌晨 2 点和第二个凌晨 2 点。输入中根本没有足够的信息来处理它。

于 2012-04-08T01:54:45.067 回答