在 MySQL 中搜索日期时间
Posted
技术标签:
【中文标题】在 MySQL 中搜索日期时间【英文标题】:Search datetime in MySQL 【发布时间】:2012-10-27 02:11:02 【问题描述】:我有一个 mysql 数据库,有一个表,其中 Time 的类型为 Nvachar(50) 并且 其值 类似于“05/09” /2012 20:53:40:843" *(月-日-年时:分:秒:毫秒)*
现在我想查询“10/05/2012 01:00:30 PM”之后的时间记录。 在进行查询之前,我在 C# 中有代码将其转换为“05/10/2012 13:00:30”。 我的查询:
SELECT * FROM ABCDFEGH WHERE capTime > '05/10/2012 13:00:30' LIMIT 0, 1
但我没有记录。所以请告诉我我怎样才能让它返回记录在上述时间之后有时间???
更多信息我的 C# 代码:
string tableName = "ABCDFEGH";
string date = "05/10/2012 13:00:30";
var query = "SELECT * FROM " + tableName + " WHERE capTime > '" + date + "' LIMIT 0, 1";
var cmd = new MySqlCommand(query, connection);
MySqlDataReader dataReader = null;
try
dataReader = cmd.ExecuteReader();
我实在是太抱歉了。我犯了一个错误,查询必须是
SELECT * FROM ABCDFEGH WHERE capTime > '05/10/2012 13:00:30' LIMIT 0, 1
这个查询成功返回我需要的记录:)
但是我怎么把它打错了
SELECT * FROM ABCDFEGH WHERE capTime > '05-10-2012 13:00:30' LIMIT 0, 1
再次抱歉,话题关闭。但是 tks for evveryone 试过 :)
【问题讨论】:
@PraveenKumar 你不能好好评论吗?为什么这么多!!!
?
【参考方案1】:
使用TIMESTAMPDIFF()
架构
CREATE TABLE ABCDFEGH (`right` varchar(3), `time` datetime);
INSERT INTO ABCDFEGH (`right`, `time`)
VALUES
('Yes', '2012-10-02 13:00:30'),
('No', '2012-10-15 13:00:30');
SQL 代码
SELECT * FROM ABCDFEGH
WHERE TIMESTAMPDIFF(MINUTE, time, '2012-10-05 13:00:30') > 0
LIMIT 0, 1
说明
TIMESTAMPDIFF()
返回 datetime_expr2 – datetime_expr1,其中 datetime_expr1 和 datetime_expr2 是日期或日期时间表达式。一个表达式可以是日期,另一个是日期时间;日期值在必要时被视为具有时间部分“00:00:00”的日期时间。结果的单位(整数)由 unit 参数给出。
小提琴:http://www.sqlfiddle.com/#!2/244cc/1 datetime
小提琴:http://www.sqlfiddle.com/#!2/063b3/1 varchar(50)
PS1: Time
可能是保留字。请避免使用它。否则将其与反引号 (`) 一起使用。
PS2:时间的格式是YYYY-MM-DD
而不是反过来。
【讨论】:
时间为列名,该列的数据类型为 Nvachar(50)。它的值类似于“05/09/2012 20:53:40:843” 好的,更新答案。给我一点时间。 @BuiAkinori 你现在能检查一下吗? 我刚刚使用了你的新答案,我得到了一个“截断不正确的日期时间值:'04/13/2012 11:25:36:241'”的列表 @BuiAkinori 已添加架构和 DDL。【参考方案2】:首先,您为什么将日期保存为NVARCHAR
?如果您仍然能够将其更改为 DATETIME
数据类型及其上的所有记录,那就更好了。
但如果没有,你可以使用STR_TO_DATE
。
SELECT *
FROM tableName
WHERE STR_TO_DATE(`capTime`, '%m/%d/%Y %H:%i:%s:%x') >
STR_TO_DATE('05/10/2012 13:00:30', '%c/%d/%Y %H:%i:%s')
See SQLFiddle Demo
来源
STR_TO_DATE DATE Formats更新 1
您的查询很容易受到SQL Injection
的影响。为了避免它
代码sn-p,
string tableName = "ABCDFEGH";
string date = "05/10/2012 13:00:30";
String query = "SELECT * FROM " + tableName + " WHERE STR_TO_DATE(`capTime`, '%m/%d/%Y %H:%i:%s:%x') > STR_TO_DATE(@dateHere, '%c/%d/%Y %H:%i:%s')";
using (MySqlConnection connection = new MySqlConnection("connectionStringHere"))
using (MySqlCommand command = new MySqlCommand())
command.Connection = connection;
command.CommandType = CommandType.Text;
command.CommandText = query;
command.Parameters.AddwithValue("@dateHere",date)
MySqlDataReader dataReader = null;
try
dataReader = cmd.ExecuteReader();
catch(MySqlException e)
// do something here
// don't suppress the error
【讨论】:
我试了一下,得到了很多“Inccorect time value:'241' for function str_to_time' 241 是毫秒。你在你的查询中错过了那部分吗?【参考方案3】:我建议使用 DATETIME
数据类型而不是 NVARCHAR。以YYYY-MM-DD HH:MM:SS
格式存储日期,即native DATETIME format recognized by MySQL。
还可以使用相同格式的日期文字。
此建议的两个原因:首先,DATETIME takes only 8 bytes,而不是最多 150 字节,这是多字节 50 字符 varchar 的潜在大小。
其次,DATETIME 的排序顺序将与时间顺序相同。因此,如果您在 Time
列上创建索引,您的 >
比较可以从索引中受益。因此,您的查询会更快。
【讨论】:
@PraveenKumar,是的,我看到这个问题被标记为mysql
。我的建议是针对 MySQL 的。
NVARCHAR
在 MySQL 中没有吗?
@PraveenKumar,MySQL 支持 NVARCHAR 作为VARCHAR CHARACTER SET utf8
的别名。
我同意你的账单。你确定@PraveenKumar 吗?以上是关于在 MySQL 中搜索日期时间的主要内容,如果未能解决你的问题,请参考以下文章
使用 Jquery Datepicker 进行 PHP MYSQL 日期范围搜索