Как преобразовать текст в дату, введенную как дата в SQL? - PullRequest
0 голосов
/ 20 июня 2019

Тип данных - TEXT, он введен как '20/11/2017' и при использовании MAX или MIN он игнорирует месяц. Я пытаюсь преобразовать его в формат даты на месяц, который также будет рассмотрен.

CAST AND CONVERT не работают, так как возвращается следующая ошибка

Сообщение 241, Уровень 16, Состояние 1, Строка 13
Ошибка преобразования при преобразовании даты и / или времени из символьной строки.

Код:

SELECT     
    user_id, 
    record_id
    --CAST(onSale AS date) AS onSale
    --CONVERT(DATE, onSale) AS onSale, 
    --CONVERT(DATE, OffSale) AS OffSale
FROM (SELECT  user_id, 
             record_id,
             (SELECT MAX(value) AS Expr1
             FROM      UPLOADS.LINES AS SUH WITH (NoLock, ReadUncommitted)
             WHERE  (field_id = 4782) AND (record_id = UR.record_id)) AS onSale,
             (SELECT MAX(value) AS Expr1
             FROM      UPLOADS.LINES AS SUH WITH (NoLock, ReadUncommitted)
             WHERE  (field_id = 4783) AND (record_id = UR.record_id)) AS OffSale
        FROM   UPLOADS.RECORDS AS UR WITH (NoLock, ReadUncommitted)
        WHERE      (module_id = 18)) AS DATA;

Конечным результатом будет, по сути, дата МАКС. Или МИН., А все три компонента - дата, месяц и год. Таким образом, если пользователь ввел две даты: 17/05/2018 и 17/04/2018, то первая должна отображаться, если используется MAX.

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Вы можете использовать код формата при использовании CONVERT, и вы даже можете использовать TRY_CONVERT, чтобы предотвратить ошибки от недопустимых дат. Я также улучшил ваш код, чтобы сделать его проще и эффективнее.

SELECT  [user_id], 
        record_id,
        MAX(CASE WHEN SUH.field_id = 4782 THEN TRY_CONVERT( DATE, SUH.value, 103) END) AS onSale,
        MAX(CASE WHEN SUH.field_id = 4783 THEN TRY_CONVERT( DATE, SUH.value, 103) END) AS OffSale
FROM  UPLOADS.RECORDS AS UR 
JOIN  UPLOADS.LINES AS SUH ON SUH.record_id = UR.record_id
WHERE  module_id = 18
GROUP BY [user_id], 
        record_id;
0 голосов
/ 20 июня 2019

Это небольшое улучшение в ответе Луиса с точки зрения SQL:

SELECT ur.[user_id], ur.record_id,
       MAX(CASE WHEN SUH.field_id = 4782 THEN TRY_CONVERT( DATE, SUH.value, 103) END) AS onSale,
       MAX(CASE WHEN SUH.field_id = 4783 THEN TRY_CONVERT( DATE, SUH.value, 103) END) AS OffSale
FROM  UPLOADS.RECORDS UR LEFT JOIN
      UPLOADS.LINES AS SUH
      ON SUH.record_id = UR.record_id AND
         SUH.field_id IN (4782, 4783)
WHERE ur.module_id = 18
GROUP BY ur.[user_id], ur.record_id;

Тем не менее, ваша проблема в том, что ваши данные не в том формате, в котором вы их считаете.Отсюда и проблема с преобразованием типов.Как говорит @marc_s в комментарии, вы должны использовать нативные и соответствующие типы SQL, которые в данном случае DATE.И, конечно же, вам не следует использовать устаревшие типы, такие как TEXT (если только вы на самом деле не имеете в виду VARCHAR() и не понимаете, что существует устаревший тип TEXT).Если вы храните значения в строках (поскольку существуют разные типы), вам следует использовать стандартный формат, ГГГГММДД или ГГГГ-ММ-ДД.

Эти значения можно найти, выполнив:

select suh.value
from uploads.lines suh
where suh.field_id in (4782, 4783) and
      try_convert(date, suh.value, 103) is null and
      suh.value is not null;

Это может помочь вам исправить ваши данные.

После того, как вы исправили свои данные, вы также можете исправить тип:

update uploads.lines
    set suh.value = convert(varchar(255), convert(date, suh.value, 103), 112);  -- this will convert the value to the default date format
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...