priti2010 Ответов: 3

Ошибка при преобразовании даты


How can I convert  or cast string "09032017" as date


and getting error as

Msg 242, Level 16, State 3, Line 3
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.


Что я уже пробовал:

select CAST('09032017' as datetime)

3 Ответов

Рейтинг:
2

CHill60

Как я уже говорил в предыдущем посте ...

Всегда старайтесь использовать "однозначные даты" при передаче информации - особенно в базы данных и из них.

Что это на самом деле означает? Это означает, что используйте формат даты, который не может быть неправильно истолкован независимо от того, в какой стране или часовом поясе вы находитесь и какой язык используется.

Пример: 01/06/2016 будет 1 июня в Великобритании, но 6 января в США.

Вы довольно близки, потому что вы использовали DD MMM yyyy в качестве формата. Что прекрасно на большинстве языков ... "27 февраля 2017" работает на английском, голландском, немецком и т. д., Но на финском языке это было бы бессмысленно (финский для февраля-helmikuu). В наши дни нет ничего необычного в том, что серверы SQL Server размещаются в разных странах по сравнению с той, где работает приложение. Нет ничего необычного и в том, что пользователи из разных стран получают доступ к одной и той же базе данных SQL.

Существует два формата дат, которые гарантированно работают для всех версий SQL Server. С пользой они работают и для большинства других баз данных.

yy-MM-ddTHH24:mi:ss
и
yyyyMMdd HH24:mi:ss
Также стоит ознакомиться со стандартом ISO для дат - ISO 8601-Википедия[^]

Если это не решит вашу конкретную проблему, то поставьте точку останова (F9) на линию
itmarr(1, 0) = Format(TxtDate.Text, "dd MMM yyyy")
и взгляните на содержимое TxtDate - вы, вероятно, обнаружите, что оно вообще не может быть отформатировано как дата. Вы действительно должны добавить некоторую проверку или использовать элемент управления DatePicker.


priti2010

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

CHill60

Вы не имеете никакого влияния на то, как данные сбрасываются в этот CSV-файл?

CHill60

@OriginalGriff сделал это замечание в своем комментарии к своему решению. Но будьте ясны, может показаться, что вы можете "вычислить", какой должна быть дата в его примере - если нет предшествующего 0 в Днях, то вряд ли будет предшествующий 0 в месяцах, так что "1032017" - это "явно" 10 марта. Но как насчет "3112017" - нет абсолютно никакого способа определить разницу между 3 ноября и 31 января.
Вам нужно вернуться к генерации CSV-файла и заставить их сделать это правильно

Рейтинг:
1

OriginalGriff

Начните с того, что решите, будет ли это 9 марта или 3 сентября.
В любом случае, все не так уж плохо. Если предположить первое:

DECLARE @dat VARCHAR(8)
SET @dat = '09032017'
SELECT CAST(SUBSTRING(@dat, 5,4) + SUBSTRING(@dat, 3, 2) + SUBSTRING(@dat, 1, 2) AS DATETIME)
Для последних:
DECLARE @dat VARCHAR(8)
SET @dat = '09032017'
SELECT CAST(SUBSTRING(@dat, 5,4) + SUBSTRING(@dat, 1, 2) + SUBSTRING(@dat, 3, 2) AS DATETIME)


Karthik_Mahalingam

+5

priti2010

Строка формата даты-ддммгггг
и что, если строка будет похожа на "0932017" или "9032017" или " 932017"

F-ES Sitecore

Надеюсь, вы узнаете, почему вы не храните даты в виде строк.

OriginalGriff

Вот почему вы всегда храните и передаете информацию о дате в значениях DateTime, чтобы они всегда были правильными. Этот вид преобразования / проверки действительно должен быть сделан на уровне представления - например, ваш код C#, VB или C++ - чтобы с пользователем можно было проконсультироваться о том, что он имел в виду, и данные, представленные в БД, всегда были однозначными и правильными.
Подумайте об этом: ни один компьютер не может посмотреть на "1032017" и правильно определить это как однозначную дату: это может быть 10 марта или первое. Поэтому бессмысленно разрабатывать код, чтобы обойти эту проблему, поскольку он даст вам плохие данные и все проблемы, которые возникнут позже.
Если Вы читаете эти данные из своей базы данных, то у вас есть большая проблема, и лучшее решение-создать новый столбец DATETIME и написать программу быстрого преобразования, чтобы изменить их все. "Плохие "или недвусмысленные даты затем можно вручную исправить, прежде чем удалить" старый " столбец и изменить программное обеспечение презентации, чтобы использовать только новые.

Рейтинг:
1

Daniel Jones

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

Convert(DATETIME, CONVERT(VARCHAR(2), @Month) + '/' + CONVERT(VARCHAR(2), @Day)
+ '/' + CONVERT(VARCHAR(4), @Year))