将日期插入表中时出现错误信息

时间:2019-04-01 05:00:25

标签: sql sql-server tsql datetime

当我尝试在所有其他表中插入日期值时,除一个表外,其他表均工作正常。无论我尝试使用哪种格式,我总是会收到错误消息,即插入的值无法从输入的char转换为预期的日期格式。

这就是我插入值的方式

-- ServiceTicket
INSERT INTO ServiceTicket
VALUES ('90000', '01-5-2019', '50000', '10000', '70000', 200.00, 100.00, 5.00, 350.00) --Error converting into DATE type

这是表结构:


CREATE TABLE dbo.ServiceTicket (
  ticketIssueNo INT NOT NULL IDENTITY(1,1) PRIMARY KEY, --Identity autoincrements
  serviceDate DATE NOT NULL,
  vehicleId CHAR(8) NOT NULL,
  customerId CHAR(8) NOT NULL,
  inspectionId CHAR(8) NOT NULL,
  serviceCost DECIMAL(10,4) NOT NULL CHECK(serviceCost BETWEEN 0.0 AND 99999.0) DEFAULT 0.0,
  inspectionCost DECIMAL(10,4) NOT NULL CHECK(inspectionCost BETWEEN 0.0 AND 99999.0) DEFAULT 0.0,
  repairCost DECIMAL(2,2) NOT NULL CHECK(repairCost BETWEEN 0.0 AND 99999.0) DEFAULT 0.0,
  GST DECIMAL(10,4) NOT NULL DEFAULT 0.0,
  amountDue DECIMAL(10,4) NOT NULL CHECK(amountDue BETWEEN 0.0 AND 99999.0) DEFAULT 0.0,
  FOREIGN KEY(vehicleId) REFERENCES Vehicle(vehicleId)
  ON UPDATE NO ACTION,
  FOREIGN KEY(inspectionId) REFERENCES VehicleInspection(inspectionId)
  ON UPDATE NO ACTION,
  FOREIGN KEY(customerId) REFERENCES Customer(customerId)
  ON UPDATE NO ACTION
)
GO

我可能会忽略一些东西。

5 个答案:

答案 0 :(得分:1)

  1. 总是列出编写插入语句时的列。

以下是根据您发布的DDL正确编写的插入语句的等效项:

INSERT INTO ServiceTicket
(serviceDate, vehicleId     , customerId, inspectionId  , serviceCost   , inspectionCost, repairCost, GST   , amountDue) VALUES
('90000'    , '01-5-2019'   , '50000'   , '10000'       , '70000'       , 200.00        , 100.00    , 5.00  , 350.00)

我使用制表符,以便每个值都将与其所进入的列完美对齐,这在列的列表较长时会很有帮助。
如您所见,serviceDate的值为'90000'-显然应该为'01-5-2019'

  1. 始终使用ISO8601格式来表示日期/日期时间值。
    其他任何格式都取决于区域性,最糟糕的是,它取决于登录名的默认语言-因此,如果您使用区域性格式,则不同的登录名可能会产生不同的结果。 ISO8601标准为日期时间格式提供了两种替代方法:yyyy-mm-ddThh:mm:ssyyyymmddThhmmss。如果您仅将仅日期的字符串值插入到DateTime数据类型的列/变量中,请确保仅使用第二种(yyyymmdd)格式-因为yyyy-mm-dd is still culture dependent with DateTime(但不能用于{ {1}}或与Date一起使用-这是您永远不再使用DateTime2的另一个原因。

所以编写插入语句的正确方法是:

DateTime

(也就是说,假设01-5-2019代表5月1日。如果代表1月5日,则应为INSERT INTO ServiceTicket (serviceDate, vehicleId , customerId, inspectionId , serviceCost , inspectionCost, repairCost, GST , amountDue) VALUES ('2019-05-01', '90000' , '50000' , '10000' , '70000' , 200.00 , 100.00 , 5.00 , 350.00) )。

答案 1 :(得分:0)

您使用的日期格式'01-5-2019'似乎不是SQL Server的默认接受日期文字。尝试使用'20190501'

INSERT INTO ServiceTicket (serviceDate, ... <other columns>)
VALUES
    ('20190501', ...);

请注意,YYYYMMDD是一种明确的,不可分离的ISO格式,正如documentation所讨论的那样。

答案 2 :(得分:0)

SQL中年份数据类型的默认格式为YYYY-MM-DD(如果您之前未更改过)Info。因此,如here所述,您应该将输入字符串转换为有效的日期类型。

答案 3 :(得分:0)

在SQL中插入日期类型的格式为YYYY-dd-MM,您需要将其更改为'2019-05-01'

答案 4 :(得分:0)

将日期格式从'01-5-2019'更改为'2019-05-01'

传递日期改为'01-5-2019'传递CAST('01-5-2019' AS DATE)