4

我有一个高级搜索功能,可以根据日期和时间查询记录。我想返回一个日期时间范围之间的所有记录,然后从该范围内我想将结果缩小到一个小时范围(例如 2012 年 5 月 1 日 - 2012 年 5 月 7 日,并显示下午 2 点到 7 点的记录)。

我所做的是在数据库中添加一个时间字段,然后使用 AND 语句查看时间字段。这工作得很好,直到我开始将日期时间和时间字段偏移几个小时以从不同的时区进行调整。这样做的问题是,当时间字段偏移 6 小时时,像 <=2pm<=7pm 这样的有效时间查询以 <=8pm<=1am 结束,这将返回零结果。

有一个更好的方法吗?

询问:

SELECT Id, Item, 
       LEFT(DAYNAME(Date - INTERVAL 0 HOUR),3) as DayofWk, 
       CONCAT('$',FORMAT(Sale,2)) AS Sale, 
       CONCAT('$',FORMAT(Retail,2)) AS Retail,
       Date, Time, Winner 
  FROM masterdata2 
 WHERE Item LIKE '%xbox%' 
   AND Date BETWEEN CONCAT('2010-6-28', ' ', '00:00:00') + INTERVAL 0 HOUR 
            AND CONCAT ('2012-7-9',' ','23:59:00') + INTERVAL 0 HOUR 
   AND time BETWEEN CONCAT ('2010-6-28',' ','00:00:00') + INTERVAL 0 HOUR 
            AND CONCAT ('2012-7-9',' ','23:59:00') + INTERVAL 0 HOUR 
   AND ( Dayofwk != 'Mon' || Dayofwk != 'Tue' || Dayofwk != 'Wed' || Dayofwk != 'Thu' || Dayofwk != 'Fri' || Dayofwk != 'Sat' || Dayofwk != 'Sun' )
4

2 回答 2

1

查看以下 MySQL 函数:

使用前两个,您只能使用一个日期时间字段而不是两个,如果我理解正确的话,这两个字段包含完全相同的值?使用第三个,您可以在时区之间转换日期时间。最后一个用于强制转换为特定类型,在这种情况下类似于CAST('22:00:00' AS TIME)=> January, 01 1970 22:00:00-0800

  • 你为什么将时间与日期时间进行比较?正如您所说,您首先将结果限制为两个日历日期之间的所有项目,然后仅限于这些日期两次之间的项目。这将意味着这样的事情:
    [...]
    AND (DATE(sold) BETWEEN CAST('2010-06-20' AS DATE) AND CAST('2012-07-20' AS DATE))
    AND (
       (TIME(sold) >= CAST('22:00:00' AS TIME))
       OR
       (TIME(sold) <= CAST('02:00:00' AS TIME))
    )
    [...]
  • 据我了解,如果偏移时间跨越两天(甚至中午和午夜?),您的查询将失败。我想您需要做的是检测到这一点,如果您想在当晚捕获所有项目(以及处理开始日期),则将您的最大日期增加 1(从2012-07-09到)。2012-07-10

  • 如果我弄错了,您能否详细说明您的查询失败的原因?8pm < x < 1am是一个有效的时间跨度,那么为什么你没有得到任何结果?

如果您提供简短的CREATE TABLE陈述和一些示例数据,这将非常有帮助。这样,人们就可以玩弄这些查询了。

于 2012-07-10T15:33:06.470 回答
0

好的,让我们试试这个(我是新手,所以对我轻松一点):

CREATE TABLE abc (ID INT(255) UNSIGNED ZEROFILL,sold DATETIME);
INSERT INTO abc (ID, sold) VALUES
(1,'2012-06-01 18:00:00'),
(2,'2012-06-20 23:00:00'),
(3,'2012-07-01 00:00:00'),
(4,'2012-07-10 01:00:00'),
(5,'2012-07-15 02:00:00'),
(6,'2012-07-20 12:00:00');
SELECT ID, sold
FROM abc
WHERE
(DATE(sold) BETWEEN '2012-06-20' AND '2012-07-20')
AND
(TIME(sold) BETWEEN '23:00:00' AND '02:00:00');

这将创建一个表并运行一个查询。结果应该返回#2-#5,但我返回零结果,因为在 18:00:00 和 02:00:00 之间没有这样的事情。然而,在 2:00:00 和 18:00:00 之间有数据。问题是如果我将时间偏移 + 小时,那么有时我会有 18:00:00 和 02:00:00。我该怎么做呢?

我的数据都在 EDT 中。我应该使用时区功能吗?

感谢您的帮助!!

于 2012-07-11T19:28:58.493 回答