用于在unix时间戳之间获取行的MySQL语句

时间:2012-01-19 19:18:43

标签: mysql sql

您好我在日期间隔内正确从MySQL表中获取所需的行时遇到问题。

我的表最初有这样的结构(是的unixtimestamps而不是mysql日期):

    id    name    departures                   depmin         depmax 
-------------------------------------------------------------------------
    1      a      1327608000                 1327608000     1327608000

    2      b   1321646400,1322856000,        1321646400     1337976000
               1325880000,1327694400,
               1329508800,1330718400,
               1331928000,1332532800,
               1333137600,1333742400,
               1334347200,1334952000,
               1336161600,1336766400,
               1337371200,1337976000

    3      c   1315166400,1316894400,        1315166400    1327780800
               1317758400,1318968000,
               1319918400,1320004800,
               1320091200,1320177600,
               1321387200,1324152000,
               1325448000,1325534400,
               1325620800,1327780800
------------------------------------------------------------------------

我的任务是让所有3行在1327536001和1327881601之间离开,但如果我这样查询:

SELECT * FROM exampletable WHERE depmin >= 1327536001 AND depmax <= 1327881601

我只获得第一行(ID为1且名称为a)。所以我完全混淆了如何在这个示例区间之间获得所有三行?

请告知如何构建我的where查询或如何重新格式化表格。

5 个答案:

答案 0 :(得分:2)

如果b和c的depmin值实际上大于1327536001,则会返回所有3行。看起来像数据问题。 SQL查询对我来说很好看。

答案 1 :(得分:2)

您获得完全有效的结果,第一行是depmin大于或等于1327536001且depmax小于或等于1327881601的唯一行。如果您只想限制depmin或仅限depmax,要求它。

答案 2 :(得分:1)

看看你的4个表记录:

1. depmin: 1327608000
   query:  1327536001      depmin >= query -> TRUE

   depmax: 1327608000
   query : 1327881601      depmax <= query -> TRUE

TRUE and TRUE -> TRUE

2. depmin: 1321646400
   query : 1327536001      depmin >= query -> FALSE

   depmax: 1337976000
   query : 1327881601      depmax <= query -> FALSE

FALSE and FALSE -> FALSe

如果我正在读你的问题,你只是想找到查询时间戳范围与数据库表时间戳重叠的任何行,那么你的逻辑应该是:

WHERE depmax >= 1327536001 AND depmin <= 1327881601
      ^^^^^^----- reversed ----^^^^^^

这样你就可以获得任何记录,其最小/最大值落在查询范围的范围内。

答案 3 :(得分:1)

如果我正确理解了您的问题,您希望获得id所有{em>任何列departures的时间戳都落在特定时间间隔内的所有内容。

遗憾的是,没有简单的方法可以实现这一目标。您必须编写一个扩展的存储过程/函数(包括解析来自departures列的字符串,将结果放入数组变量或临时表,将它们与您的边界进行比较等)或者您可以必须重新设计你的数据库。

就个人而言,我建议将数据从departures列移到单独的表格中,每行一个出发时间,如下所示:

   id            departure
------------------------------
    1        1327608000
    2        1321646400
    2        1322856000
...

然后,您将能够使用

等查询来满足您的原始要求
SELECT * FROM exampletable WHERE id IN (SELECT id FROM departures WHERE departure >= 1327536001 AND departure <= 1327881601)

答案 4 :(得分:0)

也许您必须在查询条件中交换depmindepmax

这意味着“与[1327536001 ... 1327881601]交叉的间隔”