在 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 日期范围搜索

mysql 时间转换 用EXCEL实现MySQL时间戳格式和日期格互转

mysql日期时间格式使用c#

使用 mysql 和 php 搜索除日期字段外的整个表

如何使用 mysql 提供的日期获取“时间前”? [关闭]

在 MySQL 中的日期字段上放置索引