On 2016/05/05 4:26 AM, Cecil Westerhof wrote: > The statement: > SELECT strftime('%Y-%m-%d %H:%M:%f', '2016-04-31 17:19:59.670') > gives: > 2016-04-31 17:19:59.670 > > Should that not be NULL? > > It does with: > SELECT strftime('%Y-%m-%d %H:%M:%f', '2016-04-32 17:19:59.670') > > It looks like a value of 31 is always allowed for day: > SELECT strftime('%Y-%m-%d %H:%M:%f', '2016-02-31 17:19:59.670') > gives: > 2016-02-31 17:19:59.670 >
Yes - Keith's suggestion would work best if you want to check whether the STRING you check is a valid Date-Time STRING, that's very different from checking whether it is a valid actual Date and Time. The Notion of checking valid dates is a lot more complicated, and as Simon has pointed out, should rather be done in your code since you can then decide to what level you wish to check. To name a few idiosyncrasies - Sometimes on a year with a leap-second, the date-string '2004-12-31 23:59:60' is an actual valid date-time, while the very next year, that would not be valid seconds. Leap years themselves also have problems - the easiest check is to see if the year is divisible by 4 and then allow a 29th on Feb, but of course for the year 1900 this would have been wrong, but for 2000 this is right again, etc. Then there starts the problem of confusing whole days when getting close to the Julian/Gregorian range boundaries, or when Samoa skips a whole day, if your application use historic dates, and so on. There are large libraries out there that will do all of this checking, but you have to decide how much you care about the veracity of date inputs and check accordingly. SQLite is not the tool/library to do this with. For some comic relief re computer date and time calculation problems, see: https://www.youtube.com/watch?v=-5wpm-gesOY