Як виправити помилку перетворення & lsquo; Не вдалося перетворити дату та / або час із рядка символів & rsquo; Помилка?

Існує багато випадків, коли дати та час не відображаються у форматі, який ви хочете, і вихідний запит не відповідає потребам глядачів. Існує кілька вбудованих функцій SQL Server для форматування рядка дати відповідно до ваших потреб, але для інтерпретації рядка SQL Server та для уникнення помилок перетворення він повинен бути у відповідному форматі. Коли ми намагаємося перетворити дату чи час із рядка символів, іноді виникає помилка. "Не вдалося перетворити під час перетворення дати та / або часу із символьного рядка."

помилка перетворення дати і часу

Помилка, згадана вище, зазвичай виникає, коли літерал дати неправильний і не може бути перетворений із рядка в DateTime або date. Ця помилка виникає внаслідок ряду причин, які ми детально обговоримо разом із набором рішень.

Приклад 1:

Великобританія Позначення дати та часу відображає дату у форматі день-місяць-рік (10 січня 2015 р. Або 10.10.2015 р.), Що ми можемо досягти за допомогою функції "перетворення" SQL Server built_in із функцією "конвертувати" зі стилем форматування 103.

Тут у наведеному нижче прикладі ми бачимо, що наданий рядок дати має неправильний формат. По-перше, це надання місяця, потім днів та минулого року, що є неправильним і не може бути інтерпретовано SQL Server, що призводить до помилки. Правильним форматом для перетворення дати у стилі Великобританії із використанням стилю дати “103” є “дд / мм / рррр”.

Неправильний формат:

Оголосіть @date_time_value varchar (100) = '10 / 16/2015 21:02:04 'виберіть CONVERT (datetime2, @date_time_value, 103) як UK_Date_Time_Style

Правильний формат:

Британський та французький формат дати - 103 = “дд / мм / рррр” або 3 = “дд / мм / ррр”. Тут 103 і 3 - стилі побачень.

Оголосіть @date_time_value varchar (100) = '10 / 1/15 21:02:04 'виберіть CONVERT (datetime2, @date_time_value, 103) як Date_Time_Style
Оголосіть @date_time_value varchar (100) = '10 / 1/15 21:02:04 'виберіть CONVERT (datetime2, @date_time_value, 3) як UK_Date_Time_Style

Приклад 2:

Іноді перетворення рядка на дату на сервері SQL призводить до помилки, а не через використані формати дати та часу, скоріше тому, що ви намагаєтесь зберегти неправильну інформацію, яка не є прийнятною для схеми.

Неправильна дата:

Причиною такої помилки є лише те, що в 2019 році не існує такої дати, як “29 лютого”, оскільки це не високосний рік.

Оголосити @date_time_value varchar (100) = '2019-02-29 21:02:04' виберіть приведення (@date_time_value як datetime2) як date_time_value

Правильний:

Оголосити @date_time_value varchar (100) = '2019-02-28 21:02:04' виберіть приведення (@date_time_value як datetime2) як date_time_value

Формат дати ISO 8601:

Незважаючи на те, що доступні численні формати для маніпулювання даними дат, під час роботи на глобальну / міжнародну масу вибір вибору дати та часу може бути проблемою юзабіліті. Тож слід уникати літературних дат / часу, що стосуються конкретної культури. Якщо ми вважаємо цю дату “08.08.2018”, вона буде тлумачитися по-різному в різних регіонах світу.

  • У стилі Великобританії це тлумачиться як “8 березня 2018 року”
  • У європейському стилі це трактується як “3 серпня 2018 року”

На щастя, є одна альтернатива у міжнародному форматі дат, розробленому ISO. Глобальний стандартний формат ISO 8601 “РРРР-ММ-ДДТгг: мм: сс” є більш незалежним від мови варіантом рядкових літералів, і він вирішує всі ці проблеми. Тоді як «рррр» - рік, «мм» - місяць, а «дд» - день. Тож дата “8 березня 2018 року” у міжнародному форматі ISO записана як “2018-03-08”. Таким чином, формат ISO є найкращим вибором для подання дати.

Оголосіть @date_time_value varchar (100) = '2019-03-28 21:02:04' виберіть перетворення (datetime2, @ date_time_value, 126) як [yyyy-mm-ddThh: mi: ss.mmm]

Рекомендації:

Сподіваємось, ця стаття допоможе усунути плутанину, яку я часто бачив у спільноті щодо значень дати / часу. Однак рекомендується ніколи не зберігати дати в текстовому типі (varchar, char, nvarchar, nchar або текст) Завжди зберігати значення дати у стовпцях типу DATE, DATETIME і бажано DATETIME2 (забезпечує більшу точність) і залишити форматування інформації про дату на рівень користувальницького інтерфейсу, замість того, щоб отримати з бази даних.