Сравните дату с определенным форматом даты

#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'
)