2010-02-23 5 views
2

Je dois faire correspondre à une date en utilisant l'opérateur LIKE. La date doit être au format local de l'utilisateur courant, et non au format général.Comment formater la date dans SQLite en fonction des paramètres de format de paramètres régionaux actuels?

donc utiliser la fonction strftime comme ceci:

WHERE strftime('%d.%m.%Y %H:%M', createdDate, 'localtime') LIKE '%{searchTerm}%' 

Malheureusement, cela ne fonctionne que pour le format fixe '% d% m% Y% H:..% M'. Mais je veux utiliser le format de locale actuel de l'utilisateur.

donc je dois soit: 1) Obtenez la chaîne de format strftime à partir d'un objet locale C++ 2) Faire format SQLite la date à l'aide locale actuelle se

ai déjà passé plusieurs heures sur ce en vain. Serait reconnaissant si quelqu'un me diriger dans la bonne direction sur la façon de résoudre ce problème. Etant donné que les paramètres régionaux actuels sont l'allemand, je veux obtenir quelque chose comme "% d.% M.% Y% H:% m". Pour un environnement local des États-Unis, je veux "% m /% d /% Y% H:% m"

Répondre

1

Normalement, le format de date locale peut être obtenue avec l'API Windows GetDateFormat (ou GetDateFormatEx API pour Vista). Votre programme pourrait interroger l'API puis transformer la date en conséquence. Après cela, la date peut être enregistrée dans SQLite. Cependant, une fois peut remettre en question la validité du stockage des horodatages dans un format spécifique. Cela signifie essentiellement beaucoup de code pour manipuler chaque date, ou aucune manipulation de date du tout. Puis-je suggérer, si c'est possible, de stocker dans un format simple (par exemple ISO ou UNIX estampille temporelle) et travailler à partir de cela, en sortie avec n'importe quelle saveur de GetDateFormat est nécessaire?

+0

Je stocke déjà dans le format '2010-02-25 11:19', je veux juste que l'utilisateur recherche par date en utilisant LIKE sur son format natif et je ne sais pas comment faire cela. –

+0

Ensuite, vous devriez laisser votre framework le faire. Si, par exemple, vous utilisez un .NET DateTimePicker, il affiche l'heure de l'utilisateur dans son format local, mais l'heure interne est sous une forme conventionnelle. Vous obtenez l'heure interne et exécutez la requête basée sur cela. Même pour une clause LIKE, il est préférable de l'inclure dans un contrôle plutôt que de l'enregistrer dans une base de données. Beaucoup plus facile à entretenir. – MPelletier

+0

Donc vous voulez dire que je dois essayer de transformer la date partielle entrée par l'utilisateur, puis lancer la recherche LIKE? La recherche est incrémentielle et faite après chaque frappe, je doute qu'il y ait un moyen facile de le faire .. –

0

OK, réponse différente.

Supposons que vous ayez votre MyTable:

CREATE TABLE MyTable (
    MyPrimaryKeyHnd INTEGER PRIMARY KEY, 
    ... 
    CreatedDate TEXT); 

(Où CreatedDate est au format ISO, je suppose que vous pouvez également utiliser un horodatage Unix Votre choix...)

Ensuite, une liste des formats possibles

CREATE TABLE TimeFormat (
    TimeFormatHnd INTEGER PRIMARY KEY, 
    TimeFormatString TEXT NOT NULL, 
    TimeFormatDescriptor TEXT); 

Vous autorisez votre utilisateur à choisir le format de son choix et à le conserver dans une table ou un fichier INI séparé. TimeformatString serait votre chaîne de format compatible strftime() (comme '% d.% M.% Y% H:% M'). Vous avez juste besoin de construire votre requête avec le choix de l'utilisateur.

+0

Cela signifie que je vais devoir créer une interface utilisateur supplémentaire pour permettre à l'utilisateur de choisir le format. Ceci est inutile, l'utilisateur a déjà choisi le format préféré dans le Panneau de configuration et les applications doivent respecter ce choix. J'ai juste besoin d'utiliser le format date/heure du système. –

Questions connexes