1

我有一个 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 尝试过 :)

4

3 回答 3

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不是倒过来的。

于 2012-11-07T03:16:39.970 回答
1

首先,您为什么将日期保存为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')

来源

更新 1

并且您的查询容易受到SQL Injection. 为了避免它

  • 参数化您的查询

代码片段,

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
        }
    }
}
于 2012-11-07T03:26:09.893 回答
1

我建议使用DATETIME数据类型而不是 NVARCHAR。以格式存储日期YYYY-MM-DD HH:MM:SS,这是MySQL 识别的本机 DATETIME 格式

还可以使用相同格式的日期文字。

此建议的两个原因:首先,DATETIME 仅占用 8 个字节,而不是多达 150 个字节,这是多字节 50 个字符 varchar 的潜在大小。

其次,DATETIME 的排序顺序将与时间顺序相同。Time因此,如果您在列上创建索引,您的>比较可以从索引中受益。因此,您的查询会快得多。

于 2012-11-07T03:35:51.473 回答