Я пытался создать таблицу следующим образом,
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
sql-server
Mari
источник
источник
Ответы:
SQL Server поддерживает множество форматов - см. MSDN Books Online на CAST и CONVERT . Большинство из этих форматов зависят от того, какие настройки у вас есть - поэтому эти настройки могут работать несколько раз, а иногда нет.
Способ решить эту проблему - использовать (слегка адаптированный) формат даты ISO-8601 , поддерживаемый SQL Server - этот формат работает всегда - независимо от языка SQL Server и настроек формата даты.
Формат ISO-8601 поддерживается SQL Server в двух вариантах:
YYYYMMDD
только для дат (без временной части); обратите внимание: нет тире! это очень важно!YYYY-MM-DD
является НЕ зависит от настроек DateFormat в вашем SQL Server и НЕ работать в любых ситуациях!или:
YYYY-MM-DDTHH:MM:SS
для дат и времени - обратите внимание здесь: этот формат имеет тире (но они могут быть опущены) и фиксированный вT
качестве разделителя между частью даты и времени вашегоDATETIME
.Это действительно для SQL Server 2000 и новее.
Так что в вашем конкретном случае - используйте эти строки:
и вы должны быть в порядке (примечание: вам нужно использовать международный 24-часовой формат, а не 12-часовой формат AM / PM).
Альтернативно : если вы используете SQL Server 2008 или новее, вы также можете использовать
DATETIME2
тип данных (вместо простогоDATETIME
), и ваш текущийINSERT
будет работать без проблем! :-)DATETIME2
намного лучше и намного менее требователен к конверсиям - и в любом случае это рекомендуемые типы данных даты / времени для SQL Server 2008 или новее.Не спрашивайте меня, почему вся эта тема такая хитрая и несколько запутанная - так оно и есть. Но с этим
YYYYMMDD
форматом вам подойдет любая версия SQL Server, а также любые настройки языка и даты в вашем SQL Server.источник
Преобразование на сервере SQL иногда происходит не из-за используемых форматов даты или времени, а просто потому, что вы пытаетесь сохранить неправильные данные, которые не приемлемы для системы.
Пример:
Create Table 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 - итальянский "уу", а 105 - итальянский "ууу". Следовательно:
будет работать правильно, но
выдаст ошибку.
Точно так же,
выдаст ошибку, где как
буду работать.
источник
Просто обновите формат даты, как показано ниже
Это решает проблему для меня и работает нормально
источник
DATEFORMAT
настроек сеанса . Проверьте это, запустивSET DATEFORMAT MDY;SELECT CAST('2017-08-07 00:00:00' AS datetime); SET DATEFORMAT DMY;SELECT CAST('2017-08-07 00:00:00' AS datetime);
. Он будет работать надежно, если вы добавитеT
разделитель (yyyy-MM-ddTHH:mm:ss
).По возможности следует избегать специфических для культуры литералов даты / времени .
Существует несколько безопасных форматов для предоставления даты / времени в буквальном смысле:
Все примеры для
2016-09-15 17:30:00
ODBC (мой любимый, так как он обрабатывается как настоящий тип сразу)
{ts'2016-09-15 17:30:00'}
- штамп времени{d'2016-09-15'}
- только дата{t'17:30:00'}
- Только времяISO8601 (лучший для всех )
'2016-09-15T17:30:00'
- знать оT
в середине!Неразделенный (крошечный риск быть неверно истолкованным как число)
'20160915'
- только для чистой датыХорошо иметь в виду: неверные даты имеют тенденцию появляться со странными ошибками
Еще одна причина странных ошибок конвертации: порядок выполнения!
Хорошо известно, что SQL-сервер работает в том порядке, в котором его нельзя было ожидать. Ваше письменное заявление выглядит так, как будто преобразование сделано раньше какое-либо действие, связанное с типом, но механизм решает - почему вообще - выполнить преобразование на более позднем этапе.
Вот отличная статья, объясняющая это на примерах: Rusano.com: «t-sql-functions-do-no-imply-a-not-as-a-be-as-Order-of-Execution» и вот связанный вопрос .
источник
лучший способ это код
источник
источник
Формат datetime на самом деле работает на сервере SQL
источник
m
иM
). Прочитайте комментарий Дэна Гусмана к ответу Пронаба Роя. И прочитайте другие ответы здесь ...Пожалуйста, попробуйте это.
SQL Server ожидает даты в формате MM / DD / YYYY, если в качестве языка по умолчанию задан английский язык. Здесь я сохраняю значение datepicker в базе данных sql2008. Мой тип поля - datetime в database.dpdob - это мое имя datepicker.
Теперь используйте dob в вашем запросе на вставку.
источник
Вы можете попробовать этот код
источник
У меня была эта проблема при попытке объединить
getdate()
в строку, которую я вставил в поле nvarchar.Я сделал несколько кастингов, чтобы обойти это:
Это санированный пример. Ключевая часть этого:
...' + CAST(CAST(getdate() AS datetime2) AS nvarchar) + '...
Приведена дата как
datetime2
, так иnvarchar
для конкатенации.источник
Я попробовал это, и это работает со мной:
источник
установите Культуру на английский из файла web.config
например, если вы установите культуру на арабском языке, thime будет
22.09.2017 02:16:57 ص
и вы получаете ошибку: преобразование не удалось при преобразовании даты и / или времени из символьной строки при вставке даты и времени
источник
Вот как легко преобразовать строку ISO в SQL-сервер
datetime
:Источник https://www.sqlservercurry.com/2010/04/convert-character-string-iso-date-to.html
источник
Для меня это сработало:
источник