Insert into ошибка с датой

  1. Always list the columns when writing an insert statement.

Here’s an exact equivalnet of your insert statement, written properly, based on the DDL you’ve published:

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)

I’ve used tabs so that each value would be perfectly aligned with the column it goes into, that helps a lot when you have a long list of columns.
As you can clearly see, the serviceDate gets the value '90000' — while it shoud clearly be '01-5-2019'

  1. Always use ISO8601 format for string representation of date / datetime values.
    Any other format is culture dependent, and the worst thing about it is that it depends on the default language of the login — so different logins might have different results if you use a culture-dependent format. The ISO8601 standard provides two alternatives for datetime formats: yyyy-mm-ddThh:mm:ss or yyyymmddThhmmss. If you are inserting only a date only string value into a DateTime data type column / variable, be sure to use only the second (yyyymmdd) format — because yyyy-mm-dd is still culture dependent with DateTime (but not with Date or with DateTime2 — that’s one more reason why you should never use DateTime again.

So the proper way of writing the insert statement would be this:

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)

(That is, assuming 01-5-2019 stands for May 1st. If it stands for January 5th, it should be 2019-01-05).

  • Remove From My Forums
  • Question

  • I have created a table using the below query
    CREATE TABLE job_history (
      EMPLOYEE_ID decimal(6,0) NOT NULL,
      START_DATE date NOT NULL,
      END_DATE date  NOT NULL,
      JOB_ID varchar(10) NOT NULL,
      DEPARTMENT_ID decimal(4,0) DEFAULT NULL,
      PRIMARY KEY (EMPLOYEE_ID,START_DATE)
      )
    And when I try to update values in the created table using the below query

    INSERT INTO job_history VALUES
    (102, ‘1993-01-13’, ‘1998-07-24’, ‘IT_PROG’, 60),
    (101, ‘1989-09-21’, ‘1993-10-27’, ‘AC_ACCOUNT’, 111),
    (103, ‘1993-10-28’, ‘1997-03-15’, ‘AC_MGR’, 110),
    (201, ‘1996-02-17’, ‘1999-12-19’, ‘MK_REP’, 20),
    (114, ‘1998-03-24’, ‘1999-12-31’, ‘ST_CLERK’, 51),
    (122, ‘1999-01-01’, ‘1999-12-31’, ‘ST_CLERK’, 50),
    (200, ‘1987-09-17’, ‘1993-06-17’, ‘AD_ASST’, 90),
    (176, ‘1998-03-24’, ‘1998-12-31’, ‘SA_REP’, 80),
    (175, ‘1999-01-01’, ‘1999-12-31’, ‘SA_MAN’, 81),
    (201, ‘1994-07-01’, ‘1998-12-31’, ‘AC_ACCOUNT’, 91),
    (0, ‘0000-00-00’, ‘0000-00-00’, », 0)
    I get an error saying «The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.»  how to resolve this? I tried it for .

Answers

  • The last entry you have on your insert isn’t a valid date

    (0, '0000-00-00', '0000-00-00', '', 0)

    Try the insert with it

    CREATE TABLE job_history (
      EMPLOYEE_ID decimal(6,0) NOT NULL,
      START_DATE date NOT NULL,
      END_DATE date  NOT NULL,
      JOB_ID varchar(10) NOT NULL,
      DEPARTMENT_ID decimal(4,0) DEFAULT NULL,
      PRIMARY KEY (EMPLOYEE_ID,START_DATE)
      )
    
    INSERT INTO job_history VALUES
    (102, '1993-01-13', '1998-07-24', 'IT_PROG', 60),
    (101, '1989-09-21', '1993-10-27', 'AC_ACCOUNT', 111),
    (103, '1993-10-28', '1997-03-15', 'AC_MGR', 110),
    (201, '1996-02-17', '1999-12-19', 'MK_REP', 20),
    (114, '1998-03-24', '1999-12-31', 'ST_CLERK', 51),
    (122, '1999-01-01', '1999-12-31', 'ST_CLERK', 50),
    (200, '1987-09-17', '1993-06-17', 'AD_ASST', 90),
    (176, '1998-03-24', '1998-12-31', 'SA_REP', 80),
    (175, '1999-01-01', '1999-12-31', 'SA_MAN', 81),
    (201, '1994-07-01', '1998-12-31', 'AC_ACCOUNT', 91)

    If you need to add that entry consider making the column nullable or consider using a valid date to denote ‘no date’. E.g. Navision uses 1753-01-01

    • Edited by

      Wednesday, April 15, 2015 8:53 PM

    • Proposed as answer by
      Simon_HouMicrosoft contingent staff
      Thursday, April 16, 2015 11:33 AM
    • Marked as answer by
      pituachMVP
      Thursday, April 23, 2015 6:29 AM

  • Hi

    The issue you have is with this row:

    (0, '0000-00-00', '0000-00-00', '', 0)

    the 0000-00-00 is not a valid date range.

    valid date range in tsql is: January 1, 1753, through December 31, 9999

    Regards

    Aram


    Aram Koukia

    • Marked as answer by
      pituachMVP
      Thursday, April 23, 2015 6:29 AM

1 / 1 / 0

Регистрация: 21.06.2007

Сообщений: 654

1

14.02.2008, 22:07. Показов 5756. Ответов 20


Студворк — интернет-сервис помощи студентам

Ситуация такая:

Ввожу дату формате dd.mm.yyyy — SQL выдает ошибку при dd>12. То есть восринимает дату в формает mm.dd.yyyy

Если ввести дату в формате mm.dd.yyyy сохраняет в формате dd.mm.yyyy

Поясню на конкретном примере.
31 декабря 2001 года.

В русском стандаре : 31.12.2001
В американском : 12.31.2001

INSERT INTO … () VALUES (‘31.12.2001’) — SQL выдает ошибку неверный формат даты
INSERT INTO … () VALUES (‘12.31.2001’) — SQL не выдает ошибку но в таблице сохраняет в виде ‘31.12.2001’

INSERT INTO … () VALUES (GETDATE()) — в таблице будет значение ‘31.12.2001’ если сегодня 31 декабря 2001г.

Получается что SQL воспринимает дату только в американском стандарте а хранит дату в соответствии с региональными настройками сервера.

Или я чего то не понимаю…
Вообщем у кого какие соображения по этому поводу. или может кто то сталкивался уже с этим.
Заранее спасибо за ответы.



0



msd

14.02.2008, 22:17

2

Сервер хранит в соответствии с региональными установками, но у SQL (у самого языка) свои требования.

1 / 1 / 0

Регистрация: 21.06.2007

Сообщений: 654

15.02.2008, 14:21

 [ТС]

3

то есть дату можно вставлять в SQL операторы только в соответствии с ANSI SQL (то есть а американском стандарте)?



0



0 / 2 / 3

Регистрация: 27.03.2012

15.02.2008, 14:26

4

…или использовать ф-ю to_date для преобразования из нужного формата:

to_date(‘19.02.2001′,’dd.mm.yyyy’)



0



Антон#

0 / 0 / 0

Регистрация: 14.02.2008

Сообщений: 25

17.02.2008, 14:37

5

при использовании даты в инструкциях SQL следует руководствоваться требованиями синтаксиса, которые говорят. что даты должны передаваться в формате mm/dd/yy.
Отображение дат будет происходить в соответствии с региональными настройками.
Следует помнить, что в SQL даты передаются именно текстовой строкой, хотя на самом деле, дата — это число. Поэтому при употреблении в SQL переменной типа дата/время всегда следует использовать функцию форматирования даты по заданному шаблону. так, например, в MAccess

T-SQL
1
2
3
select Tbl.date
from Tbl
where Tbl.date = Format(DateParam, '#mm/dd/yy#');

где DateParam — переменная типа дата/время



0



DmitryV

18.02.2008, 11:00

6

А можно предварительно устанавливать нужный формат командой
SET DATEFORMAT <format>

AiK

18.02.2008, 11:04

7

Блин, используйте нормальный формат дат dd mmm yyyy (разделители любые) и проблем не будет.
З.Ы: а за двуциферный год руки бы поотрывал

1 / 1 / 0

Регистрация: 21.06.2007

Сообщений: 654

18.02.2008, 11:43

 [ТС]

8

>…или использовать ф-ю to_date для преобразования из нужного >формата:

>to_date(‘19.02.2001′,’dd.mm.yyyy’)

Что то не нашел я такой функции в документации по SQL Server-у.
Smalig, эТо функция или хранимая процедура?



0



1 / 1 / 0

Регистрация: 21.06.2007

Сообщений: 654

18.02.2008, 11:46

 [ТС]

9

>З.Ы: а за двуциферный год руки бы поотрывал

зачем же так сразу руки отрывать А дату каждый хранит так как ему больше нравиться. Мне лично больше нравиться числовой формат.

И кстати с датами типа 11 Dec 2001 тоже проблем хватает. Так что кому еще руки надо отрывать можно еще поспорить.. Шучу.



0



0 / 2 / 3

Регистрация: 27.03.2012

18.02.2008, 11:46

10

блин, нет такой функции, это в оракле, сорри, ошибся



0



0 / 2 / 3

Регистрация: 27.03.2012

18.02.2008, 11:52

11

‘Working with Dates’
http://www.swynk.com/friends/trach/WorkingWithDates.asp



0



AiK

18.02.2008, 11:57

12

>Сервер хранит в соответствии с региональными установками, но у SQL (у самого языка) свои требования
Для справки. Сервер хранит дату в 109 формате. А возвращает в соответствии с настройками.

AiK

18.02.2008, 12:06

13

>И кстати с датами типа 11 Dec 2001 тоже проблем хватает.
Только у клиентщиков. Но это их проблемы. Им всё равно даты конвертить придётся. Т.к. на клиентской машине локаль может быть любая и серверу до этого никакого дела нет.
И ещё, представь, что ты разработал приложение для Васи Пупкина, и настроил сервер так, чтобы он понимал даты в 104 формате. А теперь представь, что твою приладу захотел купить John Smit. А он как известно любит 101 формат. Что делать-то будешь?
В моём случае — ничего не надо

0 / 2 / 3

Регистрация: 27.03.2012

18.02.2008, 12:10

14

>> Мне лично больше нравиться числовой формат.

да, AiK прав, дату надо хранить как положено, например, с числовым форматом как ты ищешь разницу между датами? или как проверить, что дата входит в промежуток между двумя другими?



0



1 / 1 / 0

Регистрация: 21.06.2007

Сообщений: 654

18.02.2008, 12:32

 [ТС]

15

>да, AiK прав, дату надо хранить как положено, например, с числовым >форматом как ты ищешь разницу между датами? или как проверить, что >дата входит в промежуток между двумя другими?

во первых все операции с датами выполняет сам сервер. И в каком формате она представлена в таблице не важно.

Не важно записать дату в виде 31.12.2001 или 12 Dec 2001 то в конечном счете где-то в глубине SQL сервера она все равно предстваляется в виде целого числа, а мы видим только внешнее представление этого числа (которое кстати и задается в командой SET DATEFORMAt)

И все операции с датами (арифметические, логические) эквивалентны операциям с целыми числами и не важно в каком виде они представлены в таблоцах.



0



1 / 1 / 0

Регистрация: 21.06.2007

Сообщений: 654

18.02.2008, 13:48

 [ТС]

16

…чего то все поутихли



0



0 / 2 / 3

Регистрация: 27.03.2012

18.02.2008, 13:59

17

так чего поутихли? тебе что в лоб, что по лбу :-)

у тебя поле числовое? int? как находишь разницу между датами?



0



1 / 1 / 0

Регистрация: 21.06.2007

Сообщений: 654

18.02.2008, 15:19

 [ТС]

18

ну допустим с помощью функции DATEDIFF(). Ей насколько я понимаю все равно в каком формате дата.



0



dimzon

18.02.2008, 17:53

19

Вообще-то при вставке в таблицу чтобы голова не болела можно использовать один из 2-х приёмов:
1 — insert into … values(‘20011211’), где 20011211 — дата в виде yyyymmdd (Unseparated date format называется — жуется 100%)
2 — если ты пихаешь дату из кода — используй параметризованный запрос !!! Тогда тоже никаких проблем не будет

А при сравнении дат если не нужно учитывать время — используйте datediff…

dimzon

18.02.2008, 17:58

20

>И все операции с датами (арифметические, логические) эквивалентны
>операциям с целыми числами и не важно в каком виде они представлены
>в таблоцах.

Поправочка!!!! Физически в MSSQL (и ваще почти везде у микрософта под виндами) дата хранится как действительное число двойной точности, где целая часть — число дней от января 1899, а дробная — каким-то образом закодированное время (эт я не уточнял)

I want to insert a date record to an Access database. Here is my code:

cmd.CommandText = "INSERT INTO AlarmHistory(Date) VALUES ('6/8/2012')"; 
cmd.ExecuteNonQuery(); 

It gives Syntax error in INSERT INTO statement. error at second row.

The screenshot that show my cell data type on db is below.

Cell data type at db

Jonathan Leffler's user avatar

asked Jun 14, 2012 at 22:43

Ned's user avatar

6

Use parameters

cmd.CommandText = "INSERT INTO AlarmHistory([Date]) VALUES (?)";  
cmd.Parameters.AddWithValue("@date", new DateTime(2012,06,8));
cmd.ExecuteNonQuery();

This will preserve your code from SqlInjection and you could stop to worry about quoting your values-

Just tried creating a dummy database. It’s the Date Field. You should enclose in square brackets because Date is a reserved keyword

Here the list of the reserved keywords for Jet 4.0

answered Jun 14, 2012 at 22:48

Steve's user avatar

SteveSteve

213k22 gold badges232 silver badges286 bronze badges

1

Perhaps date is a reserved word. If so, it should be delimited (maybe with brackets):

INSERT INTO AlarmHistory([Date]) VALUES ('6/8/2012')

answered Jun 14, 2012 at 23:02

Mark Wilkins's user avatar

Mark WilkinsMark Wilkins

40.7k5 gold badges57 silver badges110 bronze badges

Try use


"INSERT INTO AlarmHistory(Date) VALUES ('#6/8/2012#')"

answered Jun 14, 2012 at 22:47

davit_gri's user avatar

davit_gridavit_gri

1301 silver badge8 bronze badges

0

You should add a # sign around the date that should solve your problem.

answered Jun 14, 2012 at 22:48

Jason De Oliveira's user avatar

0

please remember before creating database table avoid to give fields names DATE and NAME

it will throws error while inserting. eg..give field password ,date instead of give like that ,password_user ,bill_date

Note:date and password not acceptable field name in MS Access table .bcoz it is a keywords.

IT SHOULD SOLVE YOUR PROBLEM

Thanks.
Rathina.

answered Oct 25, 2013 at 3:41

user2918395's user avatar

У вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует версии вашего сервера MySQL, чтобы найти правильный синтаксис для использования около ’12: 00 AM, 20.11.2020 12:00 AM) ‘в строке 1

Очевидно, что что-то не так с форматом даты, поэтому я проверил эту ссылку:

Я попытался заключить даты в одинарные кавычки, что дает эту ошибку:

ОШИБКА: 1292 (22007): неверное значение даты: «28.05.2020 12:00 AM» для столбца «date» в строке 1

Как вводить дату в sql через insert


kserg@ukr.net   ( 2001-12-14 12:12 ) [0]

Привет. В таблице есть поле типа DateTime.
При попытке вставки новой записи через INSERT.
где дату представляю как строку вылетает ошибка
(а в Interbase такой финт проходил)

quTemp1.SQL.Add(«INSERT INTO Test (data1) VALUES (»
+#39+ DateToStr(Date)+#39+»)»);

Догадываюсь, что надо значение конвертнуть.
Подскажите,как правильно это сделать.
Заранее благодарен.


Mick   ( 2001-12-14 12:14 ) [1]

И что вы все так не любите параметрические запросы?


SQLMan   ( 2001-12-14 12:49 ) [2]

Все дело в формате. Я поступаю следующим образом:

. INSERT INTO . VALUES (GetDate());

Текущую дату и время MS SQL таким образом проглатывает.

Удачи.


kserg@ukr.net   ( 2001-12-14 12:55 ) [3]

>SQLMan — идея понятна и ваш вар-т для вставки новой записи вполне пойдет,
а как быть когда надо изменить дату через UPDATE ?
Ведь суть проблемы остается.


Mick   ( 2001-12-14 12:59 ) [4]

А если клиент хочет вставить свою системную дату, а
сервер стоит в другом часовом поясе?


Tonie   ( 2001-12-14 13:07 ) [5]

По моему Mick (14.12.01 12:14) прав
..Sql = «INSERT INTO Test (data1) VALUES (:MyDate)»
параметр должен быть DateTime
потом ..ParamByName(«MyDate»).AsDateTime := MyDate


SQLMan   ( 2001-12-14 13:16 ) [6]

>Mick- А зачем так заморачиваться? Ведь время и дата сервера имеют больший приоритет. А в случае UPDATE дату и время придется конвертировать через DateTimeToStr. А лучше всего использовать параметр! Это будет и проще и надежнее.


Tonie   ( 2001-12-14 13:33 ) [7]

Если эта дата на уровне сервера известна так лучше ее вообще триггером вставлять


Mick   ( 2001-12-14 13:54 ) [8]

SQLMan: Клиент например хочет вставить астрономическое время сделки (местное) и чей-то приоритет его не волнует.

А про то как «проще и надежнее» человеку был сразу дан ответ.


kserg@ukr.net   ( 2001-12-14 14:22 ) [9]

Благодарю всех за содействие.
Не услышав нужного ответа (дискуссия пошла в напр-нии «ЧТО лучше», хотя меня интересовало, что дает ошибку),
всё же пришлось самому «копать» глубже и оказалось, что ошибка при вставке возникала из-за разных форматов представления даты: в БД мм.дд.гг , а я упорно пытался воткнуть дд.мм.гг .
Вот уж наверное ГРАБЛИ, котр. многие прошли.

Т.е. вставить дату через SQL-insert можно используя функцию CAST() или просто представляя дату как строку, только в КОРРЕКТНОМ формате.


Tonie   ( 2001-12-14 14:29 ) [10]

При использовании параметров этих «граблей» нет, но если непременно желается так писать, то тогда действительно CAST или CONVERT


Delirium   ( 2001-12-14 16:03 ) [11]

MSSQL опримально работает с форматом yyyymmdd, т.е.
«10 января 2001» = «20010110»


SQLMan   ( 2001-12-14 17:11 ) [12]

Господа программеры! Автор прав. Все зависит от того, в каком формате представляется дата в SQL Server. Можно писать и через «December 14, 2001» или «20011214», причем как обычную строку:
. WHERE Date1=»20011214″


Delirium   ( 2001-12-14 17:15 ) [13]

>SQLMan
Формат yyyymmdd — универсальный и ни от чего не зависит, по крайней мере в
MSSQL 6.5-2000


SQLMan   ( 2001-12-14 17:27 ) [14]

>Delirium
Правда, не учтя особенности этого формата, можно пытаться записать дату в формате, отличном от принятого в SQL Server по умолчанию. Насколько мне известно, формат даты зависит от региональных установок. Не так ли?

Как вводить дату в sql через insert

Пожалуйста, выделяйте текст программы тегом [сode=pas] . [/сode] . Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля. Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

Понравилась статья? Поделить с друзьями:
  • Insatiable boot device windows 10 ошибка при загрузке
  • Injection inop ошибка рено премиум перевод
  • Injection inop ошибка рено премиум dci 420
  • Injection inop ошибка рено магнум
  • Injection a controller dci ошибка