我使用以下查询来插入值。 DateOfLoan
数据类型为date
。我的表格中有一个名为DateDueBack
的额外列,此列是一个计算列,可在DateOfLoan
列中添加14天的日期。
Insert CurrentLoans(LoanID, BookISBN, MemberID, DateOfLoan)
Values (101, 'MB00001', 2, '20/10/2014'),
(102, 'AO00001', 5, '13/10/2014'),
(103, 'AH00002', 5, '13/10/2014'),
(104, 'DK10100', 2, '23/10/2014'),
(105, 'EP00666', 1, '12/10/2014'),
(106, 'HH10189', 4, '01/01/2014');
我收到以下错误消息:
Msg 241,Level 16,State 1,Line 1
从字符串转换日期和/或时间时转换失败。
当我删除日期值周围的引号时,我收到一条错误消息,指出Int与Date
不兼容。
有人可以解释上述代码的错误并提供解决方案。
提前感谢您提供任何帮助。
答案 0 :(得分:0)
试试这个: -
Insert into CurrentLoans(LoanID,BookISBN,MemberID,DateOfLoan)
Values (101, 'MB00001', 2, '2014-10-20'),
(102, 'AO00001', 5, '2014-10-13'),
(103, 'AH00002', 5, '2014-1013'),
(104, 'DK10100', 2, '2014-10-23'),
(105, 'EP00666', 1, '2014-10-12'),
(106, 'HH10189', 4, '2014-01-01');
答案 1 :(得分:0)
SQL Server的默认日期格式可能因位置而异。开箱即用,它是mm / dd / yyyy,虽然其他格式(如yyyy-mm-dd可以处理,如问题评论中所示)。
KB article 173907解释了这一点。
日期字符串为' 20/10 / 2014',SQL认为您指定的是2014年第20个月的第10天的日期,这是无效的,所以它拒绝您的输入
但是,您可以使用CONVERT函数在代码中更明确,这会使默认值和位置超出等式。
-- format 103 = dd/mm/yyyy
Insert CurrentLoans(LoanID, BookISBN, MemberID, DateOfLoan)
Values (101, 'MB00001', 2, convert(datetime, '20/10/2014', 103)),
(102, 'AO00001', 5, convert(datetime, '13/10/2014', 103)),
(103, 'AH00002', 5, convert(datetime, '13/10/2014', 103)),
(104, 'DK10100', 2, convert(datetime, '23/10/2014', 103)),
(105, 'EP00666', 1, convert(datetime, '12/10/2014', 103)),
(106, 'HH10189', 4, convert(datetime, '01/01/2014', 103));
答案 2 :(得分:0)
日期格式应该在sql-server中使用,如下格式。
YYYY-MM-dd or MM/dd/YYYY
所以,你必须尝试这样。
Insert CurrentLoans(LoanID, BookISBN, MemberID, DateOfLoan)
Values (101, 'MB00001', 2, '10/20/2014')
或
Insert CurrentLoans(LoanID, BookISBN, MemberID, DateOfLoan)
Values (101, 'MB00001', 2, '2014-10-20')
或使用Sql Convert
Insert CurrentLoans(LoanID, BookISBN, MemberID, DateOfLoan)
Values (101, 'MB00001', 2,convert(date,'20/10/2014',103))
答案 3 :(得分:0)
您的默认设置似乎是MONTH-DAY-YEAR
,因此SQL Server正在尝试将'20/10/2014'
转换为第20个月的第10天,并且只有12个月,因此您收到错误。< / p>
一个简单的解决方法是明确设置DATEFORMAT
,这样可以正常工作:
SET DATEFORMAT DMY;
SELECT CONVERT(DATE, '20/10/2014');
更好的解决方案是使用文化不变格式,其他答案建议使用ISO格式yyyy-MM-dd
,但是虽然这可以适用于您的情况,但我不提倡它。
原因是无论出于何种原因,ISO格式对于DATETIME
和SMALLDATETIME
数据类型的不文化不变量。以下是转换错误:
SET DATEFORMAT DMY;
SELECT CONVERT(DATETIME, '2015-02-20');
对于新的DATE
和DATETIME2
数据类型,它只是不变的。我经常看到这个建议,因为它是ISO格式,它仍然很容易被人眼读取,如果你碰巧在默认设置为MDY
的服务器上工作,大多数时候你会逃脱它在大多数情况下。
但是,如果您希望事情始终有效,那么在大多数情况下,DATETIME
和SMALLDATETIME
的唯一不变格式为yyyyMMdd
,因此我会建议使用它,因为它对所有类型都是不变的。
为了进一步阅读,Aaron Bertrand写了一篇很棒的文章:Bad habits to kick : mis-handling date / range queries