package main import ( "database/sql" "flag" "fmt" _ "github.com/mattn/go-sqlite3" "log" "math" "time" ) type Event struct { description string timestamp int64 } func formula(p float64) int64 { yearsAgo := math.Exp(20.3444*math.Pow(p, 3)+3) - math.Exp(3) return int64(yearsAgo * 31556926) } func closestEvent(t int64, db *sql.DB) (Event, error) { var event Event query := ` select description, timestamp from events where timestamp is not null order by abs(? - timestamp) asc limit 1 ` stmt, err := db.Prepare(query) if err != nil { return event, err } defer stmt.Close() err = stmt.QueryRow(t).Scan(&event.description, &event.timestamp) return event, err } func main() { percent := flag.Float64("p", -1, "percentage") flag.Parse() if *percent < 0 || *percent > 1 { log.Fatal("invalid percentage") } t := time.Now().Unix() - formula(*percent) db, err := sql.Open("sqlite3", "./timeline.db") if err != nil { log.Fatal(err) } defer db.Close() event, err := closestEvent(t, db) if err != nil { log.Fatal(err) } date := time.Unix(event.timestamp, 0) fmt.Printf("%v\t%v\t%v\n", event.timestamp, date, event.description) }