SQL Server конвертировать MMM-YYYY как реальную дату - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть даты в виде апреля-2019, мая-2019 и т. Д., Которые хранятся в имени поля MonthYear.

Но когда я сортирую данные, используя порядок по MonthYear, тогда они сортируютсяв алфавитном порядке (т. е.)

enter image description here

Как преобразовать MonthYear в действительную дату, чтобы он отображал MonthYear в правильном порядке.

Ответы [ 3 ]

0 голосов
/ 24 сентября 2019

Полагаю, ваш SQL-сервер не интерпретирует ваш столбец как дату.Вы можете добавить первый день месяца в свой столбец и преобразовать его в дату при сортировке.

SELECT * FROM 
`your_db`.`your_table` 
ORDER BY 
STR_TO_DATE(CONCAT('01-', `your_column`), '%d-%b-%Y')

Редактировать: Zohar был прав, что приведенный выше синтаксис правильный только для MySQL.

Пожалуйста, используйте следующее для сервера SQL:

ORDER BY 
CONVERT(DATE, CONCAT('01-', your_column), 103) 
0 голосов
/ 24 сентября 2019

У меня есть даты в форме апрель-2019, май-2019 и т. Д., Которые хранятся в поле имени MonthYear.

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

Обязательно храните даты в столбцесо значимым, описательным именем.Не называйте это Date, потому что на самом деле это не дата, о которой вы заботитесь, а комбинация месяца и года.Однако MonthYear также может быть не лучшим выбором для имени этого столбца.

Я бы предложил MonthStartDate или что-то в этом духе.
Это имя описывает, какие данные хранит столбец, а также означает, что разрешением даты, с которой вам нужно иметь дело, является месяц, а не день.

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

Вот демонстрация:

Создать образец таблицы:

DECLARE @TBL TABLE (
    MonthStartDate date,
    MonthYear AS REPLACE(RIGHT(CONVERT(char(11), MonthStartDate, 113), 8), ' ', '-') 
);

Заполнить таблицу:

INSERT INTO @TBL (MonthStartDate) VALUES
('2019-01-01'), ('2019-02-01'), ('2019-03-01'),
('2019-04-01'), ('2019-05-01'), ('2019-06-01'),
('2019-07-01'), ('2019-08-01'), ('2019-09-01'),
('2019-10-01'), ('2019-11-01'), ('2019-12-01'),
('2020-01-01');

Убедитесь, что столбец MonthYear возвращает желаемые результаты:

SELECT MonthStartDate, MonthYear
FROM @TBL
ORDER BY MonthStartDate

Результаты:

MonthStartDate  MonthYear
2019-01-01      Jan-2019
2019-02-01      Feb-2019
2019-03-01      Mar-2019
2019-04-01      Apr-2019
2019-05-01      May-2019
2019-06-01      Jun-2019
2019-07-01      Jul-2019
2019-08-01      Aug-2019
2019-09-01      Sep-2019
2019-10-01      Oct-2019
2019-11-01      Nov-2019
2019-12-01      Dec-2019
2020-01-01      Jan-2020
0 голосов
/ 24 сентября 2019

Это должно работать

DECLARE @TBL TABLE (MonthYear Varchar(10))
INSERT INTO @TBL VALUES
('Jan-2019'),('Feb-2019'),('Mar-2019'),('Apr-2019'),('May-2019'),
('Jun-2019'),('Jul-2019'),('Aug-2019'),('Sep-2019'),('Oct-2019'),
('Nov-2019'),('Dec-2019'),('Jan-2020')

SELECT
MonthYear
,CAST('1-'+MonthYear AS DATE) AS [Date]
FROM @TBL
ORDER BY [Date]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...