Обработка пустого DateTime в SQL: параметры StoredProcedures

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для объявления пустой переменной DateTime присвойте ей значение NULL:

SQL
Скопировать код
DECLARE @EmptyDate DATETIME = NULL;

Если значение NULL вам не подходит и требуется установить некоторое дефолтное значение, отличное от нулевого, укажите минимальную допустимую дату для DateTime в SQL Server — '1753-01-01':

SQL
Скопировать код
DECLARE @DefaultDate DATETIME = '1753-01-01';

В случаях, когда работа с базой данных может заранее подставить вас непредсказуемыми датами, nullable DateTime будет крайне полезен в C# коде:

csharp
Скопировать код
DateTime? freeSaturdayNight = null;
Кинга Идем в IT: пошаговый план для смены профессии

Погружение в глубины DateTime

Сравнение nullable и non-nullable

В мире SQL и языков программирования, вроде C#, использование nullable типов ясно демонстрирует разницу между отсутствием даты и её минимальным значением. В C# тип DateTime не допускает значение null, но с помощью nullable DateTime (DateTime? или Nullable<DateTime>) можно достаточно эффектно представить отсутствие данных, подобно пустой бутылке виски.

Работа с nullable DateTime в C#

Для того, чтобы привести переменную nullable DateTime в состояние "без значения" в C#, присвойте ей null:

csharp
Скопировать код
DateTime? tumbleWeedDate = null;

Всегда проверяйте наличие её значения с помощью метода HasValue, прежде чем производить над ней операции, чтобы избежать возникновения исключения при обращении к null:

csharp
Скопировать код
if (tumbleWeedDate.HasValue)
{
    // Теперь можно безопасно использовать tumbleWeedDate.Value
}

Взаимодействие с nullable DateTime в хранимых SQL процедурах

При передаче переменных nullable DateTime в хранимые SQL процедуры иногда необходимо преобразовать null-дату с помощью DBNull.Value:

csharp
Скопировать код
SqlParameter dateParameter = new SqlParameter("@Date", tumbleWeedDate.HasValue ? (object)tumbleWeedDate.Value : DBNull.Value);

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

Визуализация

Представьте процесс создания пустой переменной DateTime в SQL как работу бармена, наводящего порядок на своем столе перед началом нового рабочего дня:

Markdown
Скопировать код
До: [🥃🥃🥃]     📅 Грязный поднос с использованными стопками
После: [ ]              📅 Чистый поднос, готовый принимать новые заказы

Таким же образом, как могут быть убраны все стаканы со стойки, переменная DateTime может быть очищена от значений.

SQL
Скопировать код
DECLARE @OpenCounter DATETIME = NULL; // Когда день подходит к концу и поднос уже чист 🥃➡️[ ]

И теперь поднос блестит чистотой, готовый принимать новых клиентов и события.

Создание вашей сети безопасности для DateTime

Альтернативы для non-nullable DateTime

Для non-nullable переменных типа DateTime в качестве резервного значения можно использовать DateTime.MinValue:

csharp
Скопировать код
DateTime openingNight = DateTime.MinValue; // или просто new DateTime()

Тем не менее, такое значение может ввести в заблуждение, создав иллюзию наличия даты, где на самом деле её нет.

Избегание мин и подводных камней DateTime

Чтобы предотвратить ошибки, правильно инициализируйте переменные DateTime:

csharp
Скопировать код
DateTime openingNight = default; // Например, new DateTime()

Это присвоит openingNight значение по умолчанию, которое совпадает с DateTime.MinValue.

Взаимодействие с NULL в SQL

В SQL NULL используется для представления отсутствующего значения. Именно поэтому колонки DateTime в базе данных часто делают nullable, присваивая им NULL, чтобы указать, что событие ещё не было запланировано.

SQL
Скопировать код
CREATE TABLE Performances (
    ShowID INT PRIMARY KEY,
    ShowDate DATETIME NULL
);

Полезные материалы

  1. Should MySQL have its timezone set to UTC? – Stack Overflow — о том, насколько важно установить временную зону на вашем SQL-сервере.
  2. MySQL :: MySQL 8.0 Reference Manual :: 13.2 Date and Time Data Types — обзор дат и времени, их типов в MySQL.
  3. Datatypes – Oracle Documentation — информация о работе с датами в SQL Oracle.
  4. PostgreSQL: Documentation: 16: 5.2. Default Values — руководство о значениях по умолчанию и NULL в PostgreSQL.
  5. When to use SET vs SELECT for assigning SQL Server Variables – MSSQLTips — лучшие практики присвоения значений переменным в SQL Server: использовать SET или SELECT?
  6. SQL NULL Values – IS NULL and IS NOT NULL – W3Schools — введение в работу с NULL в SQL для начинающих.