- 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'
- 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
oryyyymmddThhmmss
. If you are inserting only a date only string value into aDateTime
data type column / variable, be sure to use only the second (yyyymmdd
) format — becauseyyyy-mm-dd
is still culture dependent withDateTime
(but not withDate
or withDateTime2
— that’s one more reason why you should never useDateTime
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 queryINSERT 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
-
Edited by
-
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
-
Marked as answer by
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.12.2001 INSERT INTO … () VALUES (‘31.12.2001’) — SQL выдает ошибку неверный формат даты 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.
где DateParam — переменная типа дата/время
0 |
DmitryV |
|
18.02.2008, 11:00 |
6 |
А можно предварительно устанавливать нужный формат командой |
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-у.
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’
0 |
AiK |
|
18.02.2008, 11:57 |
12 |
>Сервер хранит в соответствии с региональными установками, но у SQL (у самого языка) свои требования |
AiK |
|
18.02.2008, 12:06 |
13 |
>И кстати с датами типа 11 Dec 2001 тоже проблем хватает. |
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-х приёмов: А при сравнении дат если не нужно учитывать время — используйте 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.
asked Jun 14, 2012 at 22:43
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
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 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_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
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
У вас есть ошибка в синтаксисе 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