Сообщение об ошибке при вставке даты в таблицу - PullRequest
1 голос
/ 01 апреля 2019

, когда я пытаюсь вставить мои значения даты во все мои другие таблицы, все работает нормально, кроме одной.Независимо от формата, который я пробую, я всегда получаю ошибку, что вставленное значение не может быть преобразовано из входного символа в ожидаемый формат даты.

Вот так я и вставляю свои значения

-- 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 ]

1 голос
/ 01 апреля 2019
  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:ss или yyyymmddThhmmss. Если вы вставляете только строковое значение только для даты в столбец / переменную типа данных DateTime, обязательно используйте только второй (yyyymmdd) формат - поскольку yyyy-mm-dd по-прежнему зависит от культуры с DateTime (но не с Date или с DateTime2 - это еще одна причина, почему вы никогда не должны использовать DateTime снова.

Таким образом, правильный способ написания оператора вставки будет таким:

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)

(То есть если предположить, что 01-5-2019 означает 1 мая. Если это означает 5 января, то должно быть 2019-01-05).

0 голосов
/ 01 апреля 2019

Измените формат даты с '01-5-2019' на '2019-05-01'.

Вместо того, чтобы проходить дату как '01-5-2019' пройти CAST('01-5-2019' AS DATE).

0 голосов
/ 01 апреля 2019

Формат по умолчанию для типа данных года в SQL - ГГГГ-ММ-ДД (если вы не меняли его ранее) Информация .Таким образом, как описано здесь , вы должны преобразовать входную строку в допустимый тип даты.

0 голосов
/ 01 апреля 2019

Формат вставки типа даты в SQL: ГГГГ-дд-ММ. Вам необходимо изменить его на «2019-05-01»

0 голосов
/ 01 апреля 2019

Используемый вами формат даты '01-5-2019' не является принятым по умолчанию литералом даты для SQL Server. Попробуйте использовать '20190501':

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

Обратите внимание, что YYYYMMDD - это недвусмысленный неразделенный формат ISO, как обсуждается в документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...