MYSQL - 检索两个日期之间的时间戳

8

大家好,

我有一个MYSQL表格,其中有一列名为"timestamp"。它的数据类型是DATETIME,并且包含诸如"10/1/2009 3:25:08 PM'、"10/1/2009 3:30:05 PM'、"10/4/2009 3:40:01 PM'等值。

我想编写一个SQL查询语句来选择在两个日期之间发生的所有时间戳字段中的值。例如:

select timestamp from tablename where timestamp >= userStartDate and timestamp <= userEndDate

用户输入的日期不包含时间部分。您能否建议正确的MySQL查询语法? 谢谢

“它是datetime属性”这句话的意思是它具有DATETIME数据类型吗? - Quassnoi
4个回答

15
SELECT timestamp
FROM   tablename
WHERE  timestamp >= userStartDate
       AND timestamp < userEndDate + INTERVAL 1 DAY

这将选择每个日期部分在userStartDateuserEndDate之间的记录,前提是这些字段的类型为DATE(不带时间部分)。

如果起始和结束日期以字符串形式出现,则使用STR_TO_DATE从任何给定格式进行转换:

SELECT timestamp
FROM   tablename
WHERE  timestamp >= STR_TO_DATE('01/11/2010', '%m/%d/%Y')
       AND timestamp < STR_TO_DATE('01/12/2010', '%m/%d/%Y') + INTERVAL 1 DAY

用户的开始日期可以使用“10/01/2009”这种格式吗?(月/日/年) - Jake

8
SELECT timestamp
 FROM  myTable
 WHERE timestamp BETWEEN startDate AND endDate

如果您在使用 BETWEEN 与日期或时间值进行比较时希望获得最佳结果,您应该使用 CAST() 明确地将值转换为所需的数据类型。例如:如果您将一个 DATETIME 与两个 DATE 值进行比较,请将 DATE 值转换为 DATETIME 值。如果您在与 DATE 进行比较时使用字符串常量,如'2001-1-1',请将字符串转换为 DATE- http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_between

1
如果startDateendDate都是2010年1月11日,那么这将只选择timestamp = 2010年1月11日00:00:00的记录,而不是所有日期部分中有1月11日的记录。 - Quassnoi
你是对的,Quassnoi。如果用户数据允许,就像你在示例中所做的那样,添加24小时。我原本以为用户会在查询本身中使用dateTime值。 - Sampson

4

用户输入的日期没有时间戳。您可以使用以下方法将用户输入转换为时间戳:

mysql> SELECT UNIX_TIMESTAMP('2007-11-30 10:30:19');
        -> 1196440219

您的查询可以变为:
select timestamp from tablename 
where timestamp >= UNIX_TIMESTAMP(userStartDate)
and timestamp <= UNIX_TIMESTAMP(userEndDate)

2
如果您想查询两个时间戳之间的事件,例如在日历或其他存储开始和结束时间戳的地方,您可以使用以下方法:
$qry = "SELECT * 
        FROM `table` 
        WHERE '$today_start' >= `event_start` 
            AND '$today_start' <= `event_end`";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接