Конвертировать varchar в datetime для сортировки даты? - PullRequest
1 голос
/ 05 июля 2019

Я хочу попробовать отсортировать даты, но есть ограничения, потому что эти столбцы varchar.

Это существующие данные

enter image description here

Это запрос, который я проверяю.

SELECT        PERIODE, RF, APPROVE_DATE
FROM            DLY_UPGRADE
WHERE        (SLP = '368') AND (CONVERT(datetime, APPROVE_DATE, 101) > '01/01/2017')

Сообщение об ошибке:

enter image description here

Ответы [ 4 ]

0 голосов
/ 05 июля 2019

Ваша проблема с конвертацией будет выглядеть как в предложении WHERE. Но, прежде чем приступить к выполнению запроса, я бы протестировал, используя TRY_CONVERT():

select approve_date
from dly_upgrade
where slp = '368' and approve_date is not null and
      try_convert(date, approve_date, 103) is null;

Стиль 101 - ММ / ДД / ГГГГ, поэтому '15/11/2016' потерпит неудачу, поскольку 15 недопустимый месяц. 103 - это ДД / ММ / ГГГГ, что соответствует вашим ожиданиям.

Предполагая, что это не возвращает неожиданных значений в столбце, я бы предложил:

SELECT PERIODE, RF, APPROVE_DATE
FROM  DLY_UPGRADE
WHERE SLP = '368' AND
      TRY_CONVERT(datetime, APPROVE_DATE, 103) > '2017-01-01'
ORDER BY ?  -- not sure if you want PERIOD or TRY_CONVERT(datetime, APPROVE_DATE, 103)
0 голосов
/ 05 июля 2019

Если вы используете SQL Server, попробуйте следующее:

SELECT        PERIODE, RF, APPROVE_DATE
FROM            DLY_UPGRADE
WHERE        (SLP = '368') AND (CONVERT(date, APPROVE_DATE, 103) > '2017-01-01')
0 голосов
/ 05 июля 2019
SELECT        PERIODE, RF, APPROVE_DATE, cast(PERIODE as datetime) as PERIODEDatetime
FROM            DLY_UPGRADE
WHERE        (SLP = '368') AND (CONVERT(datetime, APPROVE_DATE, 101) > '01/01/2017')
order by PERIODEDatetime asc

Здесь вы можете привести ваш varchar к datetime и использовать его для заказа в asc / desc.То же самое относится и к APPROVE_DATE.

0 голосов
/ 05 июля 2019

Используйте

 DATE_FORMAT(STR_TO_DATE(`APPROVE_DATE`, '%d/%m/%Y'), '%Y-%m-%d')

Чтобы изменить дату из строки, а затем сравнить с Y-m-d форматом

 SELECT        PERIODE, RF, APPROVE_DATE
 FROM            DLY_UPGRADE
 WHERE        (SLP = '368') AND (DATE_FORMAT(STR_TO_DATE(`APPROVE_DATE`, '%d/%m/%Y'), '%Y-%m-%d')) > '2017-01-01')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...