Преобразуйте varchar в дату и время в SQL Server

Бросание включает Ссылки
List myList = new List();
//up-cast
IEnumerable myEnumerable = (IEnumerable) myList;
//down-cast
List myOtherList = (List) myEnumerable;

Уведомление, что операции против myList, такие как добавление элемента, отражаются в myEnumerable и myOtherList. Это вызвано тем, что они - все ссылки (переменных типов) к тому же экземпляру.

Бросающий безопасно. Вниз бросающий может генерировать ошибки времени выполнения, если программист сделал ошибку в типе. Безопасный вниз бросающий выходит за рамки этого ответа.

Преобразование включает Экземпляры

List myList = new List();
int[] myArray = myList.ToArray();

, myList используется для создания myArray. Это - неразрушающее преобразование (myList работы, превосходные после этой операции). Также заметьте, что операции против myList, такие как добавление элемента, не отражаются в myArray. Это вызвано тем, что они - абсолютно отдельные экземпляры.

decimal w = 1.1m;
int x = (int)w;

существуют операции с помощью синтаксиса броска в C#, которые являются на самом деле преобразования .

63
задан ughai 9 July 2015 в 05:55
поделиться

7 ответов

OP хочет mmddyy, и простой преобразователь для этого не сработает:

select convert(datetime,'12312009')

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

поэтому попробуйте следующее:

DECLARE @Date char(8)
set @Date='12312009'
SELECT CONVERT(datetime,RIGHT(@Date,4)+LEFT(@Date,2)+SUBSTRING(@Date,3,2))

ВЫХОД:

-----------------------
2009-12-31 00:00:00.000

(1 row(s) affected)
72
ответ дан 24 November 2019 в 16:24
поделиться

Look at CAST / CONVERT in BOL that should be a start.

If your target column is datetime you don't need to convert it, SQL will do it for you.

Otherwise

CONVERT(datetime, '20090101')

Should do it.

This is a link that should help as well:

3
ответ дан 24 November 2019 в 16:24
поделиться

I think CONVERT is the best choice as you can include a style (date format), so the USA default would be 110 which is mm-dd-yyyy.

0
ответ дан 24 November 2019 в 16:24
поделиться

Вероятно, у вас неверные данные, которые невозможно преобразовать. Даты никогда не должны храниться в varchar, так как это позволяет использовать такие даты, как ASAP или 30.02.2009. Используйте функцию isdate () для ваших данных, чтобы найти записи, которые не могут быть преобразованы.

Хорошо, я тестировал с заведомо хорошими данными и все равно получил сообщение. Вам нужно преобразовать в другой формат, потому что он не знает, где 12302009 - это ммддйгг или ддммйгг. Формат yyyymmdd не является двусмысленным, и SQL Server преобразует его правильно

Я заставил это работать:

cast( right(@date,4) + left(@date,4) as datetime)

Вы все равно получите сообщение об ошибке, если у вас есть какие-либо сообщения в нестандартном формате, например '112009' или какое-то текстовое значение или истинная дата вне диапазона.

4
ответ дан 24 November 2019 в 16:24
поделиться

Convert would be the normal answer, but the format is not a recognised format for the converter, mm/dd/yyyy could be converted using convert(datetime,yourdatestring,101) but you do not have that format so it fails.

The problem is the format being non-standard, you will have to manipulate it to a standard the convert can understand from those available.

Hacked together, if you can guarentee the format

declare @date char(8)
set @date = '12312009'
select convert(datetime, substring(@date,5,4) + substring(@date,1,2) + substring(@date,3,2),112)
4
ответ дан 24 November 2019 в 16:24
поделиться

SQL Server может неявно приводить строки в форме «ГГГГММДД» к дате и времени - все остальные строки должны быть явно приведены. вот два быстрых блока кода, которые выполнят преобразование из формы, о которой вы говорите:

версия 1 использует переменные модуля:

BEGIN 
DECLARE @input VARCHAR(8), @mon CHAR(2), 
@day char(2), @year char(4), @output DATETIME

SET @input = '10022009'   --today's date


SELECT @mon = LEFT(@input, 2), @day = SUBSTRING(@input, 3,2), @year = RIGHT(@input,4)

SELECT @output = @year+@mon+@day 
SELECT @output 
END

версия 2 не использует переменные модуля:

BEGIN 
DECLARE @input CHAR(8), @output DATETIME
SET @input = '10022009' --today's date 

SELECT @output = RIGHT(@input,4) + SUBSTRING(@input, 3,2) + LEFT(@input, 2)

SELECT @output
END

Оба случая полагаются на способность sql server сделайте это неявное преобразование.

7
ответ дан 24 November 2019 в 16:24
поделиться

Мне повезло с чем-то похожим:

Convert(DATETIME, CONVERT(VARCHAR(2), @Month) + '/' + CONVERT(VARCHAR(2), @Day)
+ '/' + CONVERT(VARCHAR(4), @Year))
1
ответ дан 24 November 2019 в 16:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: