8
votes

Convertir SQLite Bigint à la date

J'ai une base de données SQLite que j'utilise en tant qu'employ d'emploi ADO.NET pour mes travaux de planification Quartz.net. Dans une table, une colonne appelée start_time est de type gros int.

Y a-t-il un moyen de lancer ou de convertir un Bigint à une valeur de date? J'aimerais pouvoir interroger la base de données pour voir quels travaux sont programmés à quelle date / heure et une valeur telle que 633869892000000000 n'a pas de sens.

Merci!


0 commentaires

5 Réponses :


10
votes

En supposant que start_time est la standard second secondes - depuis-unix-époch, vous pouvez utiliser: xxx

voir http://www.sqlite.org/lang_datefunc.html , section" Modificateurs ".


0 commentaires

2
votes

C'est des centaines de nanosecondes (1 NS = 1/10 ^ 9 seconde) du début de l'âge ordinaire (CA) ou de Noël. Pour convertir la date de ce format à la date normale:

1. Tout d'abord, vous devez convertir 633869892000000000 = YourDateHundredsofnanosecondsca de 100'nanosecondes vers le format UnixEpoch (secondes depuis le 1er janvier 1970 à votre date) par formule:

(YourDateHundredsofnanosCondsCa- (rond (1969 * (365 + 1 / 4-1 / 100 + 1/400), 0) -2) * 24 * 60 * 60 * 1E9 / 100) * 100 / 1E9,

où:

1.1 rond (1969 * (365 + 1 / 4-1 / 100 + 1/400), 0) -2) = DaysOf1970Years - Compte rond de Jasus Né jusqu'en janvier, 1 1970.

1.2 CENTSOFNANOSECONDSOF1970YEARS = DaysOf1970Years * 24 * 60 * 60 * 1E9 / 100 - des centaines de nanosecondes du début de l'âge ordinaire jusqu'au début de l'époque Unix (1er janvier 1970).

1.3 YourDateinunixEpochseconds = (YourdateHundredsofnanosecondsca-centsofnanosecondsof1970Years) * 100 / 1E9 - Nombre de secondes à partir du 01/01/1970 jusqu'à votre date.

2. Convertissez la date de format de l'époque UNIX au format lisible par fonction (je donne l'exemple de SQLite):

Sélectionnez DateTime (YourDATEINUNIXIXEPOCHSECONDS, 'UNIXEPOCH');

Pour votre exemple, vous pouvez copier cette chaîne en éditeur de requête SQL dans SQLITEStudio et exécuter:

Sélectionnez DateTime ((633869892000000000- (rond (1969 * (365 + 1 / 4-1 / 100 + 1/400), 0) -2) * 24 * 60 * 60 * 1E9 / 100) * 100 / 1E9 , 'Unixepoch');

Et en conséquence, vous obtiendrez '2010-12-19 17:00:00'


1 commentaires

Pour moi, cette déclaration - Sélectionnez DateTime ((DaColumn- (rond (1969 * (365 + 1/4-1 / 100 + 1/400), 0) -2) * 24 * 60 * 60 * 1E9 / 100) * 1 00 / 1e9, "Unixepoch") de votre carte; - Construisez les dates d'une année à venir. Mais cette deuxième déclaration suggérée par @gizboy semblait avoir travaillé bien (et elle est aussi un peu plus propre) - Sélectionnez DateTime (DatColumn / 10000000 - 62135596800, 'Unixepoch') de votre carte; Merci quand même!



14
votes

Cela semblait travailler pour moi; Sélectionnez DateTime (DateColumn / 10000000 - 62135596800, 'UNIXEPOCH') de votre carte

crédits à; https://forums.xamarin.com/discussion/54282 / SQLite-DateTime-Convert-to-Net-DateTime


0 commentaires

1
votes

Cette date est stockée sous forme de ticks. Le lien suivant couvre un peu plus de détails sur les tiques.

DateTime.Ticks Propriété P>

Pour convertir les tiques en date de la date, vous pouvez utiliser SQL Query comme P>

DateTime dt = new DateTime(633869892000000000); //output: 2009-08-27​T17:00:00


0 commentaires

0
votes

Cette solution ne me donne qu'une colonne de valeurs vides:

Sélectionnez DateTime (TIMESTMP, 'UNIXEPOCH') à partir de Logging_Event


0 commentaires