#sql-server #tsql
#sql-сервер #tsql
Вопрос:
У меня есть столбец типа varchar в таблице, и в нем есть другой тип формата даты. Я хочу сравнить это с конкретным форматом даты. Если это верно, то должны быть возвращены только эти строки. Формат даты — «ггггммдд».
например, 20200831 = 'yyyymmdd'
даты указаны в приведенном ниже формате
20200831
31/Aug/2020
08-31-2020
2020-08-31
Это несколько форматов даты, которые присутствуют в таблице.
Ответ №1:
Если я правильно понимаю вопрос, возможным решением является следующее утверждение:
SELECT DateText
FROM (VALUES
('20200831'),
('31/Aug/2020'),
('08-31-2020'),
('2020-08-31')
) v (DateText)
WHERE CONVERT(varchar(8), TRY_CONVERT(date, DateText), 112) = DateText
Результат:
DateText
20200831
Комментарии:
1. Большое вам спасибо. Ваше решение действительно помогло мне.
Ответ №2:
SELECT *
FROM tableName
WHERE ISDATE(dateCol) = 1 AND ISNUMERIC(dateCol) = 1;
Функция ISDATE() возвращает 1, если значение столбца является допустимой датой SQL Server
и ISNUMERIC() возвращает 1, если значение столбца является допустимым числом, поэтому 20200831 удовлетворяет обоим условиям.
Ответ №3:
Если вы используете SQL Server 2012 или более поздней версии, то TRY_CONVERT
функция является одним из вариантов здесь:
SELECT
dt,
TRY_CONVERT(datetime, dt) AS dt_out
FROM yourTable
WHERE
TRY_CONVERT(datetime, dt) = '2020-08-31';
ДЕМОНСТРАЦИЯ
Данные:
WITH yourTable AS (
SELECT '20200831' AS dt UNION ALL
SELECT '31/Aug/2020' UNION ALL
SELECT '08-31-2020' UNION ALL
SELECT '2020-08-31'
)