您好我在日期间隔内正确从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查询或如何重新格式化表格。
答案 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)
也许您必须在查询条件中交换depmin
和depmax
。
这意味着“与[1327536001 ... 1327881601]交叉的间隔”