Member 13249696 Ответов: 1

Дата не преобразуется в гггг-ММ-ДД для случайной записи


Привет,

Моя цель-сохранить дату только в формате даты гггг-ММ-ДД в поле типа данных NVARCHAR(100).

У меня есть SQL-скрипт для преобразования всего формата даты в "гггг-ММ-ДД", и у меня есть поле NVARCHAR(100) для хранения даты. Но какая-то случайная запись сохраняется как в том же формате даты без преобразования.

Что я уже пробовал:

Я использую следующий скрипт

КОНВЕРТИРОВАТЬ(NVARCHAR(15), КОНВЕРТИРОВАТЬ(ДАТА, '15.06.2017', 101), 23)

Но для какой-то случайной записи мои данные сохраняются без преобразования (то есть запись сохраняется как "15.06.2017" вместо "2017-06-15").

Если у кого-то есть альтернативное решение для этого, пожалуйста, помогите мне.

Заранее большое вам спасибо.

1 Ответов

Рейтинг:
7

OriginalGriff

Цитата:
Моя цель-сохранить дату только в формате даты гггг-ММ-ДД в поле типа данных NVARCHAR(100).

Просто: не надо.
Никогда не храните даты как что-либо, кроме DATE или DATETIME - это всегда вызывает серьезные проблемы в будущем. Как только вы получите плохие данные - а вы это сделаете, и похоже, что у вас есть - вы не сможете легко определить, какое было предполагаемое значение, и это делает его ненадежным. Например, если запись сохранена как «06/05/2017», это 6 мая 2017 г. или 5 июня 2017 г.? Ничего не скажешь, и обе формы вполне действительны в зависимости от вводящего их пользователя. Хуже того, «06/05/04» 6 мая 2004 г., 5 июня 2004 г., 4 мая 2006 г. или «что-то еще»? Как только эти данные попадают в БД, вы не можете сказать, потому что вся информация об исходной локали пользовательского ввода (которая определяет, как даты форматируются в строки на этом конкретном ПК) больше не доступна.

Всегда храните данные как применимый тип данных: целые числа в INT, плавающие числа в FLOAT (или десятичные) и даты в DATE или DATETIME - и оставьте форматирование входных и выходных значений программному обеспечению презентации, а не бэкенду.


Richard Deeming

Одно небольшое придирчивое замечание: вы должны использовать datetime2 вместо datetime Он имеет лучший диапазон, лучшее разрешение и потенциально может занимать меньше места.