Что лучший способ состоит в том, чтобы сохранить дату без года в базе данных SQL?

Я создаю приложение, которое имеет ежедневную кавычку, которая должна быть сохранена в базе данных. Каждая кавычка присвоена со днем года, включая один на 29-е февраля. Так как кавычка только заботится о дне не о годе, я должен все еще использовать тип smalldatetime? Сообщите мне свои мнения, Спасибо!!

11
задан Matthew Flaschen 20 April 2010 в 13:17
поделиться

10 ответов

У меня недавно была эта проблема, в моем первоначальном дизайне была сохранена дата, а я просто проигнорировал год. Однако это показалось неправильным. Я решил просто удалить его и вместо этого создать отдельный столбец День / Месяц . Он просто казался намного чище и более читаемым.

Обновление

Прошло много времени с тех пор, как я написал этот ответ, однако, оглядываясь назад, я поднимаю руки вверх и говорю, что комментарии были наивно упущены. Сохранение дня / месяца в виде отдельных полей может привести к хранению недействительных данных, тогда как если вы сохранили их как полные DateTime , вы фактически получаете эту проверку бесплатно.

В зависимости от вашей политики проверки это может не вызывать беспокойства, однако, если вы полагаетесь на проверку БД, я бы посоветовал вам либо сохранить ее как DATE , либо просто вытащить соответствующую информацию, либо использовать триггер. чтобы выполнить некоторую проверку перед вставкой.

17
ответ дан 3 December 2019 в 02:52
поделиться

Как насчет varchar с 0305, равным 5 марта.

0
ответ дан 3 December 2019 в 02:52
поделиться

Если вам нужно сохранить данные дня и месяца, вы можете также использовать SmallDateTime и просто игнорировать компонент года (или установить для него одно и то же значение по всем направлениям, например 2000, который был високосный год, поэтому разрешены високосные даты).

Вы по-прежнему можете использовать правильные функции даты и времени с правильным типом данных, и если вы выберете поле VARCHAR, вы закончите преобразование в него и из него.

2
ответ дан 3 December 2019 в 02:52
поделиться

Я бы не стал использовать для этого дату и время. В некотором смысле вы храните неверные данные. Например, вы должны сохранить 4/20/2010 как 4/20/2012 или любой другой год, который вы выберете. Несмотря на то, что год не имеет значения для вашего приложения, такой подход может привести к некоторым неожиданным проблемам.

Например, что, если у вас каким-то образом указана дата с неправильным годом? Ваши расчеты будут неправильными.

Поскольку нет собственного типа для поддержки того, что вы делаете, я бы сохранил значения как varchar и сделал бы все необходимые вычисления в пользовательской функции.

0
ответ дан 3 December 2019 в 02:52
поделиться

Другой вариант (я не думаю, что кто-то еще предлагал) - хранить месяц и день как отдельные целые числа. Итак, чтобы найти сегодняшнюю запись, вы можете:

select quote from quoteTable where month = 4 and day = 20;

Это позволит вам получать сообщения, относящиеся к конкретному дню, без использования дат (и игнорирования года).

Просто идея.

7
ответ дан 3 December 2019 в 02:52
поделиться

Вы также можете рассмотреть возможность использования одного int для хранения дня в году.

Перевод между удобочитаемым форматом и днем ​​года может быть немного болезненным. С другой стороны, будет очень легко назначить даты котировкам и выбрать их.

SELECT quote FROM QuoteTable 
WHERE dayOfYear = DATEPART(dy, GETDATE())
0
ответ дан 3 December 2019 в 02:52
поделиться

Это зависит от того, что вы делаете с этими датами. Если наличие года в базе данных не является проблемой, вы можете взять високосный год и использовать его для хранения дат, игнорируя его в представлении приложения.

3
ответ дан 3 December 2019 в 02:52
поделиться

Как насчет прямого числа. Вы можете выбирать кавычки каждый раз случайным образом и отмечать другое логическое поле по мере их выбора. Вы можете сбросить логическое поле в конце года.

Это также позволяет вам со временем добавлять новые цитаты в базу данных без необходимости удалять те, которые у вас уже есть.

1
ответ дан 3 December 2019 в 02:52
поделиться

Поскольку не существует такого типа Interval, как Oracle, у вас есть один из нескольких вариантов, которые приходят на ум.

  • Сохраните год при использовании datetime / smalldatetime, вам не потребуется ничего лишнего за его хранение, просто выберите не отображать его.
  • Принять подход типа DW с таблицей дат и связать с ней с помощью PK / FK
  • Используйте тип, не основанный на дате, такой как smallint или varchar, хотя этот {{1 }} вполне может привести к некоторым трудностям в том, чтобы запросы оставались доступными для сортировки и избегали сканирования.
1
ответ дан 3 December 2019 в 02:52
поделиться

Вы по-прежнему можете использовать столбец datetime в своей базе данных и использовать функцию SQL DatePart () для получения дня года.

SELECT datepart(dy,myDateColumn) FROM myTable
0
ответ дан 3 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: