我的表格中有下面提到的时间戳 需要的结果:1997年至1999年上午时间之间的数据,即(12:00:01至11:59:59)
1997-09-22 18:02:38
1997-10-15 01:26:11
1997-11-03 02:42:40
1997-10-15 01:25:19
1999-10-15 01:25:19
1999-10-15 23:25:19
1998-03-12 20:15:12
1998-02-13 23:52:53
1997-09-23 23:26:01
2000-09-23 23:26:01
我正在尝试以下查询,但没有给出正确的结果
SELECT * FROM r WHERE ts BETWEEN '1997-01-01 00:00:01' AND '1999-12-31 11:59:59'
我可以通过分别提取小时和分钟来找到结果,但是有一种方法可以让查询有点简洁吗?
答案 0 :(得分:0)
您可以使用SELECT *
FROM r
WHERE ts >= STR_TO_DATE('1997-01-01', '%Y-%m-%d')
AND ts < STR_TO_DATE('2000-01-01', '%Y-%m-%d')
功能:
ts <= '1999-12-31 11:59:59'
P.S:ts < '2000-01-01'
隐含地表示SELECT DATE(t.TransactioDate) AS date, COUNT(DISTINCT u.UserID)
FROM user u
INNER JOIN transaction t ON u.UserID = t.UserID
INNER JOIN (
SELECT userID
FROM transaction
WHERE TransactioDate BETWEEN '2018-01-13' AND '2018-02-12'
GROUP BY userID
HAVING COUNT(DISTINCT(DATE(transactioDate))) = DATEDIFF('2018-02-12', '2018-01-13') + 1
) AS t1 ON t1.userID = u.userID
WHERE t.TransactioDate BETWEEN '2018-01-13' AND '2018-02-12'
GROUP BY date
ORDER BY t.TransactioDate
答案 1 :(得分:0)
在跨越多年的范围比较中,无法指定特定的小时数。我们需要添加另一个谓词(条件)来缩小与范围扫描匹配的行。
我们可以使用DATE_FORMAT
函数来获取小时,分钟和秒(每种格式都有两位数字)
例如,根据规定的规格(仅在00:00:01和11:59:59之间的时间),我们可以添加如下内容:
AND DATE_FORMAT(r.ts,'%h:%i:%s') BETWEEN '00:00:01' AND '11:59:59'
但是在午夜之后省略第二个,而在中午之前第二个省略,这似乎很奇怪。 (MySQL DATETIME的分辨率小于一秒,最多六位小数。)
就个人而言,我将“早上时间”识别为0到11之间的小时值,如下所示:
AND DATE_FORMAT(r.ts,'%h') BETWEEN '00' AND '11'
这将包括上午12:01之前和上午11:59之后的“早晨时间”。例如,这些条件将包含这些时间,但第一个示例条件将省略这些时间:
00:00:00.555
11:59:59.023
规范并不完全清楚......确定是否应包括或排除这些时间将有助于澄清规范。我怀疑规范的陈述有些含糊,我们真的希望在午夜到中午之间的所有“早晨时间”。
SELECT r.*
FROM r
WHERE r.ts >= '1997-01-01'
AND r.ts < '2000-01-01'
AND DATE_FORMAT(r.ts,'%h) BETWEEN '00' AND '11'
但这实际上取决于“早上时间”的定义,是否包括或排除午夜后的第一秒。
答案 2 :(得分:0)
您需要分别提取日期和时间以获取所需的数据。 在MySql中,您可以使用DATE_FORMAT方法提取相同的内容。
在此处阅读更多内容:DATE_FORMAT(date, format)
您的查询将是:
SELECT * FROM `r` WHERE DATE_FORMAT(ts, "%Y-%m-%d") BETWEEN '1997-01-01' AND '1999-12-31' AND DATE_FORMAT(date_time, "%H:%i:%s") BETWEEN '00:00:01' AND '11:59:59'
如果您的日期不是DateTime格式,那么您需要使用STR_TO_DATE方法将字符串/原始日期转换为日期时间格式。
在此处阅读更多内容:STR_TO_DATE(date, format)