Я создаю приложение, которое имеет ежедневную кавычку, которая должна быть сохранена в базе данных. Каждая кавычка присвоена со днем года, включая один на 29-е февраля. Так как кавычка только заботится о дне не о годе, я должен все еще использовать тип smalldatetime? Сообщите мне свои мнения, Спасибо!!
У меня недавно была эта проблема, в моем первоначальном дизайне была сохранена дата, а я просто проигнорировал год. Однако это показалось неправильным. Я решил просто удалить его и вместо этого создать отдельный столбец День
/ Месяц
. Он просто казался намного чище и более читаемым.
Обновление
Прошло много времени с тех пор, как я написал этот ответ, однако, оглядываясь назад, я поднимаю руки вверх и говорю, что комментарии были наивно упущены. Сохранение дня / месяца в виде отдельных полей может привести к хранению недействительных данных, тогда как если вы сохранили их как полные DateTime
, вы фактически получаете эту проверку бесплатно.
В зависимости от вашей политики проверки это может не вызывать беспокойства, однако, если вы полагаетесь на проверку БД, я бы посоветовал вам либо сохранить ее как DATE
, либо просто вытащить соответствующую информацию, либо использовать триггер. чтобы выполнить некоторую проверку перед вставкой.
Если вам нужно сохранить данные дня и месяца, вы можете также использовать SmallDateTime
и просто игнорировать компонент года (или установить для него одно и то же значение по всем направлениям, например 2000, который был високосный год, поэтому разрешены високосные даты).
Вы по-прежнему можете использовать правильные функции даты и времени с правильным типом данных, и если вы выберете поле VARCHAR, вы закончите преобразование в него и из него.
Я бы не стал использовать для этого дату и время. В некотором смысле вы храните неверные данные. Например, вы должны сохранить 4/20/2010 как 4/20/2012 или любой другой год, который вы выберете. Несмотря на то, что год не имеет значения для вашего приложения, такой подход может привести к некоторым неожиданным проблемам.
Например, что, если у вас каким-то образом указана дата с неправильным годом? Ваши расчеты будут неправильными.
Поскольку нет собственного типа для поддержки того, что вы делаете, я бы сохранил значения как varchar и сделал бы все необходимые вычисления в пользовательской функции.
Другой вариант (я не думаю, что кто-то еще предлагал) - хранить месяц и день как отдельные целые числа. Итак, чтобы найти сегодняшнюю запись, вы можете:
select quote from quoteTable where month = 4 and day = 20;
Это позволит вам получать сообщения, относящиеся к конкретному дню, без использования дат (и игнорирования года).
Просто идея.
Вы также можете рассмотреть возможность использования одного int для хранения дня в году.
Перевод между удобочитаемым форматом и днем года может быть немного болезненным. С другой стороны, будет очень легко назначить даты котировкам и выбрать их.
SELECT quote FROM QuoteTable
WHERE dayOfYear = DATEPART(dy, GETDATE())
Это зависит от того, что вы делаете с этими датами. Если наличие года в базе данных не является проблемой, вы можете взять високосный год и использовать его для хранения дат, игнорируя его в представлении приложения.
Как насчет прямого числа. Вы можете выбирать кавычки каждый раз случайным образом и отмечать другое логическое поле по мере их выбора. Вы можете сбросить логическое поле в конце года.
Это также позволяет вам со временем добавлять новые цитаты в базу данных без необходимости удалять те, которые у вас уже есть.
Поскольку не существует такого типа Interval, как Oracle, у вас есть один из нескольких вариантов, которые приходят на ум.
Вы по-прежнему можете использовать столбец datetime в своей базе данных и использовать функцию SQL DatePart () для получения дня года.
SELECT datepart(dy,myDateColumn) FROM myTable