将日期值输入到具有日期数据类型的列时,我收到错误消息

时间:2015-02-20 09:33:55

标签: sql sql-server

我使用以下查询来插入值。 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不兼容。

有人可以解释上述代码的错误并提供解决方案。

提前感谢您提供任何帮助。

4 个答案:

答案 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格式对于DATETIMESMALLDATETIME数据类型的文化不变量。以下是转换错误:

SET DATEFORMAT DMY; 
SELECT CONVERT(DATETIME, '2015-02-20');

对于新的DATEDATETIME2数据类型,它只是不变的。我经常看到这个建议,因为它是ISO格式,它仍然很容易被人眼读取,如果你碰巧在默认设置为MDY的服务器上工作,大多数时候你会逃脱它在大多数情况下。

但是,如果您希望事情始终有效,那么在大多数情况下,DATETIMESMALLDATETIME唯一不变格式为yyyyMMdd,因此我会建议使用它,因为它对所有类型都是不变的。

为了进一步阅读,Aaron Bertrand写了一篇很棒的文章:Bad habits to kick : mis-handling date / range queries