C#编程向SQLite数据库中正确写入DateTime类型数据

最近用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')

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值