7
votes

SQLite: Comment lier et insérer la date de C ++?

Utilisation C ++ (Visual Studio) et SQLite. Comment puis-je lier une date à un paramètre?

sqlite3_stmt *statement;

const char *sql = 
    "INSERT INTO employees "
        "(full_name,"
        "date_started)" 
    " VALUES "
        "(@full_name,"
        "@date_started)";

sqlite3_prepare_v2(database_, sql, -1, &statement, NULL);

int parameterIndex = sqlite3_bind_parameter_index(statement, "@full_name");
sqlite3_bind_text(statement, parameterIndex, "John Smith", -1, SQLITE_TRANSIENT);

parameterIndex = sqlite3_bind_parameter_index(statement, "@date_started");

// <??? what goes here ???>
// I want to include the local current time, so I want to know:
// 1. what's the best way to get local time in C++
// 2. and what goes here for the date binding

sqlite3_step(statement);

sqlite3_finalize(statement);


0 commentaires

3 Réponses :


0
votes

Vous devriez pouvoir obtenir l'heure locale à l'aide de la fonction localTime () . xxx

voir http: //www.cplusplus. com / référence / clibrary / ctime / localtime / pour des informations détaillées et un exemple.


1 commentaires

Eh bien merci pour cela, mais ma question principale est de savoir comment lier cela à un paramètre SQLite.



0
votes

Voici ce que j'ai imaginé. Cela fonctionne mais je suis ouvert à de meilleures méthodes.

time_t rawtime;
struct tm *currentTime;
time ( &rawtime );
currentTime = localtime ( &rawtime );

const int TIME_STRING_LENGTH = 20;
char buffer [TIME_STRING_LENGTH];

// SQLite expected date string format is "YYYY-MM-DD HH:MM:SS" (there are others too)
strftime(buffer, TIME_STRING_LENGTH, "%Y-%m-%d %H:%M:%S", currentTime);
sqlite3_bind_text(statement, parameterIndex, buffer, -1, SQLITE_TRANSIENT);


3 commentaires

Préfère utiliser gmtime au lieu de localTime car il n'est pas sensible à l'heure d'été.


Ah je suppose que c'est probablement pourquoi mon compilateur me donnait un avertissement sur l'utilisation de localTime .


En fin de compte, je préfère avoir la date d'heure comme des cordes, alors je choisis cela comme la réponse. Ce n'est pas vraiment clair pour moi, ce qui est le meilleur format DateTime pour une colonne de date, mais le temps dira.



8
votes

Il n'y a pas d'astuce à cela:

const char * sql =
    "INSERT INTO Employees(full_name, data_started) VALUES (?, ?)";
time_t time = 0x3DE43B0C;
sqlite3_bind_int64(statement, 2, time);


4 commentaires

J'ai défini ma colonne Date_Started dans ma table en tant que DateTime, qui a une affinité numérique (qui apparaît surtout la même chose que réelle). Que se passe-t-il lorsque j'utilise sqlite3_bind_text avec une chaîne de date pour insérer une date? Est-il automatiquement converti en une valeur réelle (car c'est le type de colonne)? De même avec votre exemple entier, SQLite Auto-est-il le convertir en réel?


Il sera gardé comme un entier. Si vous essayez de mettre du texte dans une colonne avec une affinité numérique, SQLite ne le convertira que si cela peut être fait sans perte et de manière réversible, sinon il le gardera en tant que texte.


Eh bien, toutes mes dates insérées via la liaison de texte se présentent dans la base de données comme texte. Je viens d'essayer votre méthode et un entier se présente. Je ne sais pas que j'aime voir un entier, cela signifie que je dois toujours appeler une fonction DateTime (date_started, 'unixepoch') pour voir quelle est la date. Savez-vous quelque chose sur les avantages / les inconvénients de différents types de stockage des dates dans SQLite?


C'est le compromis habituel entre l'espace de stockage et le temps de requête. Vous pouvez vérifier si appeler DateTime ralentit votre requête; Sinon, il serait préférable de stocker des dates de la forme entier plus compacte.