从char数据类型到datetime数据类型的转换导致datetime值越界

      昨天,在公司里测试程序时,出现如"从char数据类型到datetime数据类型的转换导致datetime值越界"的错误.自已在网上终于找到了对一个解决方案,让我受到了很大启迪.自已随后分析数据库表的结构,原来数据表中的monthcode列是varchar(50)类型而不是datetime类型.

 源码:                     .................. AND (TP.confirm_flag = 1) AND (CONVERT (datetime, TP.monthcode) = @month)">      出错处
                             
                       
                             

 

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

改为:                     .................. AND (TP.confirm_flag = 1) AND(CONVERT ( varchar(50), TP.monthcode,23) = @month)">                                  
                       
                             

 

     好了,程序测试通过.遇到这种情况请大家不要乱了阵脚,先检查数据类型,看你查询的字段类型是否和表设计的字段类型相同.虽然出现的错误是一样的,但每个人遇到的具体情况可能不同,解决方法也不同,我只是提供了我的一种,仅供大家参考.

 

     现在我把网上找到的代码给大家分享.

     SQL 中的时间截取转换Convert进行日期的查询 ,如字段a 类型为datettime,时间显示为yy:mm:dd:hh:mm:ss
如果只输入年月日查询这样select * from a where a.time1=@time,只会得到不想要的结果。那么将datetime进行转换并截断来进行查询,就会得到满意的结果:
select * from a where convert(varchar(10),a.time1,121))=@time
更多转换见下:
Convert (data_type [ ( length ) ] , expression [ , style ])样式见以下效果:

CONVERT(varchar(100), GETDATE(), 0):  06 21 2007 10:14AM
CONVERT(varchar(100), GETDATE(), 1):  06/21/07
CONVERT(varchar(100), GETDATE(), 2):  07.06.21
CONVERT(varchar(100), GETDATE(), 3):  21/06/07
CONVERT(varchar(100), GETDATE(), 4):  21.06.07
CONVERT(varchar(100), GETDATE(), 5):  21-06-07
CONVERT(varchar(100), GETDATE(), 6):  21 06 07
CONVERT(varchar(100), GETDATE(), 7):  06 21, 07
CONVERT(varchar(100), GETDATE(), 8):  10:14:29
CONVERT(varchar(100), GETDATE(), 9):  06 21 2007 10:14:29:637AM
CONVERT(varchar(100), GETDATE(), 10) 06-21-07
CONVERT(varchar(100), GETDATE(), 100) 06 21 2007 10:15AM
CONVERT(varchar(100), GETDATE(), 101) 06/21/2007
CONVERT(varchar(100), GETDATE(), 103) 21/06/2007
CONVERT(varchar(100), GETDATE(), 104) 21.06.2007
CONVERT(varchar(100), GETDATE(), 105) 2007.06.21
CONVERT(varchar(100), GETDATE(), 105) 21-06-2007
CONVERT(varchar(100), GETDATE(), 106) 21 06 2007
CONVERT(varchar(100), GETDATE(), 107) 06 21, 2007
CONVERT(varchar(100), GETDATE(), 108) 10:15:16
CONVERT(varchar(100), GETDATE(), 109) 06 21 2007 10:15:16:310AM
CONVERT(varchar(100), GETDATE(), 11) 07/06/21
CONVERT(varchar(100), GETDATE(), 110) 06-21-2007
CONVERT(varchar(100), GETDATE(), 111) 2007/06/21
CONVERT(varchar(100), GETDATE(), 112) 20070621
CONVERT(varchar(100), GETDATE(), 113) 21 06 2007 10:15:16:310
CONVERT(varchar(100), GETDATE(), 114) 10:15:16:310
CONVERT(varchar(100), GETDATE(), 12) 070621
CONVERT(varchar(100), GETDATE(), 120) 2007-06-21 10:15:16
CONVERT(varchar(100), GETDATE(), 121) 2007-06-21 10:15:16.310
CONVERT(varchar(100), GETDATE(), 126) 2007-06-21T10:15:16.310
CONVERT(varchar(100), GETDATE(), 13) 21 06 2007 10:15:16:310
CONVERT(varchar(100), GETDATE(), 130)  6 ????? ??????? 1428 10:15:16:310AM
CONVERT(varchar(100), GETDATE(), 131)  6/06/1428 10:15:16:310AM
CONVERT(varchar(100), GETDATE(), 14) 10:15:16:310
CONVERT(varchar(100), GETDATE(), 20) 2007-06-21 10:15:16
CONVERT(varchar(100), GETDATE(), 21) 2007-06-21 10:15:16.310
CONVERT(varchar(100), GETDATE(), 22) 06/21/07 10:15:16 AM
CONVERT(varchar(100), GETDATE(), 23) 2007-06-21
CONVERT(varchar(100), GETDATE(), 24) 10:15:16
CONVERT(varchar(100), GETDATE(), 25) 2007-06-21 10:15:16.310
重要默认情况下,SQL Server 根据截止年份2049 解释两位数字的年份。即,两位数字的年份 49 被解释为 2049,而两位数字的年份 50 被解释为 1950。许多客户端应用程序(例如那些基于 OLE 自动化对象的客户端应用程序)都使用 2030 作为截止年份。SQL Server 提供一个配置选项("两位数字的截止年份"),借以更改 SQL Server 所使用的截止年份并对日期进行一致性处理。然而最安全的办法是指定四位数字年份。
当从 smalldatetime 转换为字符数据时,包含秒或毫秒的样式将在这些位置上显示零。当从 datetime 或 smalldatetime 值进行转换时,可以通过使用适当的 char 或 varchar 数据类型长度来截断不需要的日期部分。

你可能感兴趣的:(SQL)