John Th Ответов: 2

Получить месяц на дату varchar


Как получить месяц на дату, тип данных поля даты которой является varchar? Помогите ребятам.

Я попробовал сделать запрос ниже, но он не работает:

Ошибка:

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.


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

select datepart(mm, cast('March-04-2008' as datetime))

2 Ответов

Рейтинг:
1

Maciej Los

В дополнение к решению №1 по Корнфельд Элиягу Петер[^]...

Если месяц всегда находится в начале строки-даты, я бы предложил создать вспомогательную таблицу. Видеть:

DECLARE @tmp TABLE(Mnth INT IDENTITY(1,1), MnthName VARCHAR(30))
INSERT INTO @tmp (MnthName)
VALUES('January'), ('February'), ('March') --and so on...

DECLARE @stringDates TABLE(stringDate VARCHAR(30))
 INSERT INTO @stringDates (stringDate)
 VALUES('March-04-2008'), ('February-28-2008'), ('January-14-2008')

SELECT s.stringDate AS OriginalDate, m.Mnth
FROM @tmp AS m INNER JOIN @stringDates AS s ON m.MnthName = LEFT(stringDate, CHARINDEX('-',stringDate)-1)


Последнее замечание: никогда не храните даты в виде строки! Свидание есть свидание и ничего больше!


John Th

Тогда какой тип данных я должен использовать?

Maciej Los

Дата-время!

Richard Deeming

На самом деле, поскольку здесь нет никакой временной части, date это был бы лучший выбор.

Если бы речь шла о времени, datetime2 было бы лучше, чем datetime - он имеет больший диапазон, большую дробную точность по умолчанию и дополнительную точность, заданную пользователем.

John Th

Я хочу сохранить дату как; март-04-2018. Какой тип данных я должен использовать? Помогите мне, пожалуйста.

Maciej Los

Ошибаешься! Используйте дату, а не ее строковое представление!
Преобразование между типами данных является утомительным и может привести к потере эффективности.

John Th

Окей. Тогда как же я могу получить значение месяца в datetime?

Maciej Los

Month(ProperDateTime) возвращает 3 за март
Если вы хотите отобразить март из DateTime, используйте Функция DateName
;)

John Th

Я хочу узнать номер месяца. Например: март, возвращаемое значение равно 03.

Maciej Los

DECLARE @dt DATETIME = GETDATE()
SELECT RIGHT('00' + CONVERT(VARCHAR(2), DATEPART(MM, @dt)), 2) AS MyMonth
--or
SELECT RIGHT('00' + CONVERT(VARCHAR(2), MONTH(@dt)), 2) AS MyMonth

John Th

Как же так? @losmac

John Th

Как это исправить?

Выберите stock_id, stock_qty, справа('00' + конвертировать(VARCHAR(2), месяц(stock_date)), 2) из tblstocks, где stock_date = '03';

Maciej Los

Исправить что?
Примечание: Я не вижу вашего экрана и не имею доступа к вашему жесткому диску. И я даже не могу читать в твоих мыслях...

John Th

Я все исправил. https://ibb.co/dmpHEc

John Th

Можно ли преобразовать его в мммм-ДД-гггг? 19 марта-2018 года будет возвращение.

try6 — imgbb.com[^]

Рейтинг:
0

Kornfeld Eliyahu Peter

Бросить в SQL можно преобразовать строку в дату, если это в формате в формате iso8601 - 'гг-мм-ддтчч:мм:СС.ННН'...
Метод CONVERT может работать с различными форматами, но не с тем форматом, который вы указали здесь...
Приведение и преобразование (Transact-SQL) | Microsoft Docs[^]


Maciej Los

5ed!

Kornfeld Eliyahu Peter

Спасибо!