1

私はMySQLデータベースを持っています.Time's Type is Nvachar(50)という列を持つテーブルがあり、その値"05/09/2012 20:53:40:843" * (Month-date-year hour:mins :秒:ミリ秒) *

ここで、「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

再度申し訳ありませんが、トピックを閉じます。しかし、eveveryoneのtksは試しました:)

4

3 に答える 3

1

DATETIMENVARCHARの代わりにデータ型を使用することをお勧めします。日付をYYYY-MM-DD HH:MM:SSフォーマットで保存します。これは、MySQLで認識されるネイティブのDATETIMEフォーマットです

また、同じ形式の日付リテラルを使用します。

この推奨の2つの理由:最初に、DATETIMEは、マルチバイトの50文字のvarcharの潜在的なサイズである最大150バイトではなく、8バイトしか使用しません。

次に、DATETIMEの並べ替え順序は、時系列の順序と同じになります。したがって、Time列にインデックスを作成すると、>比較はインデックスの恩恵を受けることができます。結果として、クエリははるかに高速になります。

于 2012-11-07T03:35:51.473 に答える
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

使用する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 に答える