MySQL - 日期 - 时间戳

时间:2018-02-13 05:12:44

标签: mysql sql datetime timestamp

我的表格中有下面提到的时间戳 需要的结果: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'

我可以通过分别提取小时和分钟来找到结果,但是有一种方法可以让查询有点简洁吗?

3 个答案:

答案 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)