Я пытался создать таблицу следующим образом,
create table table1(date1 datetime,date2 datetime);
Сначала я попробовал вставить значения, как показано ниже,
insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');
Это привело к ошибке,
Невозможно преобразовать varchar в datetime
Затем я попробовал следующий формат, предложенный в одном из постов нашего stackoverflow,
insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
,convert(datetime,'01-01-2001 12:00:00 AM',5));
Но все равно получаю ошибку,
Сбой преобразования при преобразовании даты и/или времени из символьной строки.
Есть предложения?
SQL Server поддерживает множество форматов - смотрите MSDN Books Online on CAST and CONVERT. Большинство из этих форматов зависит от того, какие настройки вы имеете - поэтому эти настройки могут работать в некоторых случаях, а иногда нет.
Способ решения этой проблемы - использовать (слегка адаптированный) ISO-8601 формат даты, который поддерживается SQL Server - этот формат работает всегда - независимо от языка SQL Server и настроек формата даты.
Формат ISO-8601 поддерживается SQL Server в двух вариантах:
YYYYMMDD
для просто дат (без временной части); обратите внимание: без тире!, это очень важно! YYYY-MM-DD
является НЕ независимым от настроек формата даты в вашем SQL Server и будет НЕ работать во всех ситуациях!или:
YYY-MM-DDTHH:MM:SS
для дат и времени - обратите внимание: этот формат имеет тире (но они могут быть опущены), и фиксированный T
в качестве разделителя между датой и временем в вашем DATETIME
.Это действительно для SQL Server 2000 и более новых версий.
Так что в вашем конкретном случае - используйте эти строки:
insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');
и все будет в порядке (примечание: для этого нужно использовать международный 24-часовой формат, а не 12-часовой AM/PM).
Альтернатива: если вы используете SQL Server 2008 или новее, вы также можете использовать тип данных DATETIME2
(вместо простого DATETIME
) и ваш текущий INSERT
будет работать без проблем! :-) DATETIME2
намного лучше и намного менее придирчиво относится к преобразованиям - и в любом случае это рекомендуемый тип данных даты/времени для SQL Server 2008 или новее.
SELECT
CAST('02-21-2012 6:10:00 PM' AS DATETIME2), -- works just fine
CAST('01-01-2012 12:00:00 AM' AS DATETIME2) -- works just fine
Не спрашивайте меня, почему вся эта тема такая запутанная и немного сбивает с толку - просто так оно и есть. Но с форматом YYYYMMDD
все должно быть в порядке для любой версии SQL Server и для любого языка и формата даты в вашем SQL Server.
Конвертация в SQL-сервере иногда не удается не из-за используемых форматов даты или времени, а просто потому, что вы пытаетесь хранить неправильные данные, которые неприемлемы для системы.
Пример:
Создать таблицу MyTable (MyDate);
.
Insert Into MyTable(MyDate) Values ('2015-02-29');
.
SQL-сервер выдаст следующую ошибку:
Conversion failed when converting date and/or time from character string.
.
Причина этой ошибки заключается в том, что просто нет такой даты (29 февраля) в году (2015).
Простой ответ - 5 - это итальянский "yyy", а 105 - итальянский "yyy". Следовательно:
SELECT convert(datetime,'21-02-12 6:10:00 PM',5)
будет работать правильно, но
SELECT convert(datetime,'21-02-12 6:10:00 PM',105)
выдаст ошибку.
Аналогично,
SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)
даст ошибку, в то время как
SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)
будет работать.
По возможности следует избегать культуре конкретных литералов даты и времени.
Есть некоторые безопасность форматы, чтобы обеспечить дату/время как литерал:
Все примеры для 2016-09-15 17:30:00`
{ц'2016-09-15 17:30:00'}
--штамп времени {д'2016-09-15'}
--Дата только{Т'17:30:00'}
--время только'2016-09-15T17:30:00'
--быть в курсе " т " в середине!'20160915'
--только для чистого датаSQL-сервер хорошо знаю, чтобы делать вещи в порядок можно не ожидать. Ваше письменное заявление выглядит как преобразование делается до какой тип действий имеет место, но двигатель решает, - почему-либо - делать преобразования в дальнейшем.
Вот большая статья, объясняя это на примерах: Rusano.com: "t-sql-functions-do-no-imply-a-certain-order-of-execution" и вот это вопроса.
Просто обновить формат даты, как ниже
yyyy-MM-dd hh:MM:ss
Это решает проблему для меня, и она отлично работает
лучший способ это код
"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"
Пожалуйста, попробуйте это.
В SQL Server ожидает даты в формате ММ/ДД/гггг,если английский как язык по умолчанию.Вот коплю значение datepicker к базе sql2008.Мой тип поля datetime в базе данных.dpdob мое имя элемента datepicker.
Dim test = dpdob.Text.Replace("-", "/")
Dim parts As String() = test.Split(New Char() {"/"c})
Dim firstPart As String = parts(0)
Dim thirdPart As String = parts(2)
Dim secondPart As String = parts(1)
Dim test1 = secondPart + "/" + firstPart + "/" + thirdPart
Dim dob = test1
Теперь использовать DOB в свой вставить запрос.
convert(datetime2,((SUBSTRING( ISNULL(S2.FechaReal,e.ETA),7,4)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),4,2)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),1,2) + ' 12:00:00.127'))) as fecha,
Формат даты на самом деле, который работает на SQL сервер
yyyy-mm-dd hh:MM:ss
У меня была эта проблема при попытке объединить `функции getdate () в строку, которую я вставила в тип данных nvarchar поле.
Я сделал некоторые формы, чтобы обойти это:
INSERT INTO [SYSTEM_TABLE] ([SYSTEM_PROP_TAG],[SYSTEM_PROP_VAL]) VALUES
(
'EMAIL_HEADER',
'<h2>111 Any St.<br />Anywhere, ST 11111</h2><br />' +
CAST(CAST(getdate() AS datetime2) AS nvarchar) +
'<br /><br /><br />'
)
Что'ы подчищенный пример. Ключевую часть, которая является:
...' + литой(литой(функции getdate() в качестве типа datetime2) как nvarchar) + '...
Литые дату как типа datetime2
, тогда как аргумент
, чтобы объединить его.
установить культуру на английском из интернета.файл config
<globalization uiCulture="en-US" culture="en-US" />
например, если вы установите культуры на арабском этапе будет
22/09/2017 02:16:57.
и вы получаете ошибку:ошибка преобразования даты или времени из символьной строки при вставке датавремя