最近用C#编写了一个程序,里面涉及向SQLite数据库写入DateTime类型数据,实际时间为2012/11/30 0:20:00,但写入数据库后变成1899/12/30 00:00:00。

实际情况是时间写入数据库失败,1899/12/30 00:00:00是数据库的默认值。

经过尝试,发现不能直接用C#的DateTime赋值,而应使用字符串给[PASS_TIME]字段赋值。
生成时间字符串代码:
DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");

修改代码后DateTime类型数据入库正确。

解决方案:sqlite 对datetime型的数据读取错误

----------------------------------------------------------------------------------------------

https://blog.csdn.net/kingmax54212008/article/details/38945941?utm_source=blogkpcl14&utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase

---------------------------------------------------------------------------------------------

异常详细信息:  System.FormatException: 该字符串未被识别为有效的 DateTime。

解决方案:

在日期保存到Sqlite数据库时转换一个类型,比如:string _now = System.DateTime.Now.ToString("s");

也就是说在.ToString()方法中加一个s,即可解决日期读取错误的问题。

简单代码示例:

string _indate = Request["indate"]; //输入的日期如:2009-2-21
DateTime _inTime = Convert.ToDateTime(_indate);

//如下是保存数据SQL语句

insert into 表(indate) values(‘“ + _inTime.ToString("s") + "');   //这里转换

--------------------------------------------------------------------------------------------------------------

https://blog.csdn.net/hexingen/article/details/71577318?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4.control

------------------------------------------------------------------------------------------------------------

. SQLite特殊数据存储(重点):

  1. 存储日期和时间数据类型:

    SQLite没有专门提供存储日期和时间存储类型,通常可以TEXT , REAL和INTEGER类型来替代的方式存储。

    • TEXT对应的数据: "YYYY-MM-DD HH:MM:SS.SSS" 格式的数据

    • REAL对应的数据: Julian日期格式存储,即从公元前 4714 年 11 月 24 日格林尼治时间的正午开始算起的天数。

    • INTEGER对应的数据:Unix时间形式的数据 , 即从 1970-01-01 00:00:00 UTC 算起的秒数。

    可以以任何上述格式来存储日期和时间,并且可以使用内置的日期和时间函数来自由转换不同格式。

  2. 布尔数据类型:

    采用true用1替代和false用0替代的方式存储。

SQLite 内置的日期 & 时间函数

SQLite 支持以下五个日期和时间函数,如:

 date(timestring, modifier, modifier, ...)  : 返回YYYY-MM-DD 格式的日期
 time(timestring, modifier, modifier, ...) :  返回 HH:MM:SS格式的时间
 datetime(timestring, modifier, modifier, ...) 返回YYYY-MM-DD HH:MM:SS格式的日期时间
 julianday(timestring, modifier, modifier, ...): 返回从格林尼治时间的公元前 4714 年 11 月 24 日正午算起的天数
 strftime(format, timestring, modifier, modifier, ...) :返回指定格式(即第一个参数)的日期

上述五个日期和时间函数把时间字符串(TimeString)作为参数。时间字符串后跟零个或多个 modifier 修饰符。strftime() 函数也可以把格式字符串 format 作为其第一个参数。

注意点 :以上几个函数也可以转换成strftime函数,如下:

date(...)         strftime('%Y-%m-%d', ...)
time(...)         strftime('%H:%M:%S', ...)
datetime(...)     strftime('%Y-%m-%d %H:%M:%S', ...) 
julianday(...)    strftime('%J', ...)   

下面将详细讲解函数中的不同类型的时间字符串和修饰符,格式。

  1. TimeString(时间字符串)

    一个带有格式的具体时间(例如,2017-04-31),现在的时间用now替代。更多格式,具体如下:

    • YYYY-MM-DD :例如,2017-12-30
    • YYYY-MM-DD HH:MM: 例如,2017-12-30 12:10
    • YYYY-MM-DD HH:MM:SS.SSS 例如:2070-12-30 12:10:04.100
    • MM-DD-YYYY HH:MM 例如:30-12-2017 12:10
    • HH:MM 例如: 12:10
    • YYYY-MM-DDTHH:MM 2017-12-30 12:10
    • HH:MM:SS 12:10:01
    • YYYYMMDD HHMMSS 20171230 121001
    • now :例如,当前时间,2017-4-9
  2. Modifier(修饰符)

     1. NNN days
     2. NNN hours
     3. NNN minutes
     4. NNN.NNNN seconds
     5. NNN months
     6. NNN years
     7. start of month
     8. start of year
     9. start of day
     10. weekday N  
     11. unixepoch
     12. localtime
     13. utc
    • 从第1到第6,只是加减指定具体数量的时间或者日期,NNN为负数,则减去NNN个时间或者日期。反之,NNN为正,则加;
    • 第7到第9,是将指定日期设置到当前的月或年或日开始.start of month即当年-当月-1日,start of year即当年-1月-1日,依次类推;
    • 第10是将日期设置下一个星期N,其中星期日为0;
    • 第11是unix时间戳转换成对应的日期和时间;
    • 第12是转成当地的日期和时间;

    注意点:修饰符顺序是从左边到右边依次逐个执行的,即执行完前一个才能执行下一个。

  3. Strftime()中使用的格式

格式   格式说明
%d  天数,例如:01-31中某一个天
%f  带小数部分(SS.SSS格式)的秒
%H  小时,例如: 00-23中某一个小时
%j  一年中的第几天,001-366
%J  儒略日数,DDDD.DDDD
%m  月,00-12中某一具体月份
%M  分,00-59
%s  从 1970-01-01 算起的秒数
%S  秒,00-59
%w  一周中的第几天,0-6 (0 is Sunday)
%W  一年中的第几周,01-53
%Y  年,YYYY
%%  % symbol

SQLite案例之使用时间和日期函数:

在Android SDK中的tools文件下找到Sqlite.exe或者SQLite下载进行下载获取。使用Sqlite3.exe来运行sql语句。

案例1:获取YYYY-MM-DD格式的当前日期,例如 2017-4-9

分析: 
1. 采用date()函数返回YYYY-MM-DD格式的日期 
2. 采用时间字符串now来指定当前时间

因此,此SQL语句为:SELECT date('now');

案例2:获取当前月的最后一天,例如2017-4-30

分析: 
1. 采用date()函数返回YYYY-MM-DD格式的日期 
2. 采用时间字符串(now)来指定当前时间,这时日期为 :当年-当月-当日 
3. 使用修饰符(start of month)设置时间为当月,在这时日期为:当年-当月-1日 
4. 添加一个月,即修饰符(1 month),在这时日期为:当年-(当月+1)-1日 
5. 减去一天,即修饰符(- 1 day),获取到当月最后一天,在这时日期为:当年-当月-最大天数

因此,此SQL语句为:SELECT date('now','start of month','+1 month','-1 day');

案例3:返回从1970-01-01 00:00:00到当前时间所流经的秒数

分析: 
1. 采用strftime()函数 
2. 采用秒的格式,%s 
3. 指定时间字符串(now)

因此,此SQL语句为:SELECT strftime('%s','now');

案例4:计算从 2004 年某一特定时刻以来的秒数

分析: 
1. 计算到2004-01-01 02:34:56的秒速 
2. 计算到当今的秒数 
3. 两者相减操作。

因此,此SQL语句为:SELECT strftime('%s','now') - strftime('%s','2004-01-01 02:34:56');

SQLite.exe执行sql,输出结果如下:

资源参考:

如果对于sqlite不熟悉的同学, 请移步:

http://www.runoob.com/sqlite/sqlite-tutorial.html (菜鸟教程),基础的关于sqlite的东西这边都可以找到,可能有其他的网站欢迎推荐。建议自己下一个sqlite3的黑窗口,将具体的代码自己撸一把,加深理解和应用。

1.sqlite中时间函数

参见:http://www.runoob.com/sqlite/sqlite-date-time.htm

2.查询本周数据

select * from 表名 where 字段名 between datetime(date(datetime('now',strftime('-%w day','now'))),' 1 second')

and datetime(date(datetime('now',(6 - strftime('%w day','now'))||' day','1 day')),'-1 second')

3.查询本月的数据

select * from 表名 where 字段名 between datetime('now','start of month',' 1 second') and

datetime('now','start of month',' 1 month','-1 second')

4.查询最近7的值(从当前起向前推6天,包括今天)

select * from 表 名 where 时间字段 + between date('now','start of day','-6day') and date('now')

5.查询最近一年的数据(从这个月起向前推12个月)

select * from 表 名 where 时间字段 between date('now','start of month','-12 month and date('now')

最近用C#编写了一个程序,里面涉及向SQLite数据库写入DateTime类型数据,实际时间为2012/11/30 0:20:00,但写入数据库后变成1899/12/30 00:00:00。实际情况是时间写入数据库失败,1899/12/30 00:00:00是数据库的默认值。经过尝试,发现不能直接用C#的DateTime赋值,而应使用字符串给[PASS_TIME]字段赋值。生成时间字符串代码:DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");修改.
本文实例讲述了C#操作SQLite数据库帮助类。分享给大家供大家参考,具体如下: 最近有WPF做客户端,需要离线操作存储数据,在项目考虑使用Sqlite嵌入式数据库,在网上找了不少资料,最终整理出一个公共的帮助类。 Sqlite是一个非常小巧的数据库,基本上具备关系型数据库操作的大多数功能,Sql语法也大同小异。下面是我整理的帮助类代码: 1.获取 SQLiteConnection 对象,传入数据库有地址即可。 /// 获得连接对象 /// SQLiteConnection public sta
//打开数据库 SQLiteConnection conn = new SQLiteConnection(); SQLiteConnectionStringBuilder connstr = new SQLiteConnectionStringBuilder(); connst
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品使用了它,它占用资源非常的低,在嵌入式设备,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。 SQLite第一个Alpha版本诞生于2000年5月。 至2
手机应用程序Sqlite时间函数及时间处理是本文要介绍的内容,主要讲解了Sqlite时间函数及时间处理的表现方式,我们来看详细内容。这篇文章是根据 SQLite 官方 WIKI 里的内容翻译,如果有什么翻译不当的地方希望大家指出,毕竟我的英文水平实在很差。SQLite包括以下五个时间函数: date(日期时间字符串, 修正符, 修正符, ……) time(日期时间字符串, 修正符, 修正符, …
F_ID = Guid.NewGuid().ToString(), MachineNum = "666", RepairEndTime = Convert.ToDateTime("2021/04/27 13:00:00.500"), var tempRepairEndTimeList = new
就像在提交日志的时候系统会把提交的时间记录下来一样,如果想在sqlite3下创建的表里插入数据的时候也把插入数据的时间点存储在sqlite数据库里怎么处理呢? 创建一个数据库,如foo.db 在这个表里创建一个表: CREATE TABLE time([ID] INTEGER PRIMARY KEY,[IDCardNo] VARCHAR (50),[CreatedTime]
# 查询 DATETIME 类型数据 cursor.execute("SELECT * FROM your_table WHERE datetime_column >= '2022-01-01 00:00:00'") # 获取查询结果 result = cursor.fetchall() # 处理查询结果 for row in result: print(row) # 关闭数据库连接 conn.close()