Функція SQL Server для повернення мінімальної дати (1 січня 1753 р.)


91

Я шукаю функцію SQL Server, щоб повернути мінімальне значення для дати і часу, а саме 1 січня 1753 р. Я б не хотів твердо кодувати це значення дати у своєму сценарії.

Чи існує щось подібне? (Для порівняння, в C #, я міг би просто зробити DateTime.MinValue) Або мені довелося б писати це самостійно?

Я використовую Microsoft SQL Server 2008 Express.


2
Просто цікаво: чому ви взагалі плануєте використовувати цю дату на відміну від того, щоб замість цього надати стовпцю значення NULL?
Джо Стефанеллі,

1
Ви можете використовувати CONVERT(smalldatetime, 0)для smalldatetime.
Гейб,

5
КОНВЕРТУВАТИ (невеликий час, 0) або КОНВЕРТУВАТИ (дата і час, 0) або привести (0 як дату і час) не є мінімальним значенням дати та часу
Геннадій Ванін Геннадій Ванин

2
@Joe: Стовпець не допускає значення NULL, і я не хочу його змінювати, оскільки я не створюю цю таблицю.
Джеремі

Відповіді:


90

Ви можете написати призначену користувачем функцію яка повертає мінімальне значення дати так:

select cast(-53690 as datetime)

Потім використовуйте цю функцію у своїх сценаріях, і якщо вам коли-небудь доведеться її змінити, це є лише в одному місці.

Крім того, ви можете використовувати цей запит, якщо віддаєте перевагу йому для кращої читабельності:

select cast('1753-1-1' as datetime)

Приклад функції

create function dbo.DateTimeMinValue()
returns datetime as
begin
    return (select cast(-53690 as datetime))
end

Використання

select dbo.DateTimeMinValue() as DateTimeMinValue

DateTimeMinValue
-----------------------
1753-01-01 00:00:00.000

55
Якщо ви хочете мати довільну константу, '1753-1-1'це набагато краще, ніж-53690
Гейб

6
Ім'я функції зробить очевидним значення значення.
RedFilter

3
Навіть у SQL Server 2012 немає функції отримання мінімальної дати, подібної до getdate (), отже, наведена вище є єдиним можливим рішенням. Це для тих, хто шукає кращого рішення в рішенні, пов'язаному з sql server 2012.
Рам,

1
Просто використовуйте DateTime2 (7). Він точно відповідає типу .NET DateTime. Використання sql 'datetime' - це погано, як використання 'varchar' замість 'nvarchar'. 'nvarchar' узгоджується з типом .NET String. Та сама ідея. Тоді ви можете просто використовувати DateTime.MinValue скрізь.
Трійко

2
Як згадував Френк Гілліч нижче, cast('17530101' as datetime)також буде уникати регіональних проблем і є трохи більш читабельним, ніж -53690.
Джим

29

Ви бачили об'єкт SqlDateTime ? використовуйте SqlDateTime.MinValueдля отримання мінімальної дати (1 січня 1753 р.).


32
Це має бути функція SQL, а не функція .NET.
Джеремі

5
Хоча SqlDateTime.MinValue корисний, оманливим є відповідь на це. @Jeremy просить вбудовану функцію sql, а не щось із бібліотеки класів .NET
Еван

6
плюс один для цього допоміг із подібним запитанням, але в контексті .Net не SQL; як це відбувається з цим запитанням ..
t_plusplus

Можливо, ви насправді можете досягти цього, використовуючи новий U-SQL
Капе

13

Оскільки я не можу коментувати прийняту відповідь через недостатність репутації, мій коментар є відповіддю.

за допомогою select cast('1753-1-1' as datetime) терміну `` помилка '' виникає через помилку, якщо запустити в базі даних з регіональними налаштуваннями, не приймаючи тестування формату РРРР-ММ-ДД.

Замість цього використовуйте select cast(-53690 as datetime)або a Convertіз зазначеним форматом дати та часу.


6

Введіть дату як рідне значення, 'yyyymmdd'щоб уникнути регіональних проблем:

select cast('17530101' as datetime)

Так, було б чудово, якби TSQL мав MinDate() = '00010101', але такої удачі не було.


4

Ось швидкий і зручний для читання спосіб отримати мінімальне значення дати

Примітка: Це детермінована функція , тому для подальшого підвищення продуктивності ми могли б також застосувати WITH SCHEMABINDING до поверненого значення.

Створіть функцію

CREATE FUNCTION MinDate()
RETURNS DATETIME WITH SCHEMABINDING
AS
BEGIN
    RETURN CONVERT(DATETIME, -53690)

END

Виклик функції

dbo.MinDate()

Приклад 1

PRINT dbo.MinDate()

Приклад 2

PRINT 'The minimimum date allowed in an SQL database is ' + CONVERT(VARCHAR(MAX), dbo.MinDate())

Приклад 3

SELECT * FROM Table WHERE DateValue > dbo.MinDate()

Приклад 4

SELECT dbo.MinDate() AS MinDate

Приклад 5

DECLARE @MinDate AS DATETIME = dbo.MinDate()

SELECT @MinDate AS MinDate

3

Це не 1 січня 1753 р., Але виберіть привід (`` як дату і час), який показує: 1900-01-01 00: 00: 00.000 дає значення за замовчуванням для сервера SQL. (Мені все одно виглядає більш неініціалізованим)


1
Це неправильно. Базовий час - 1 січня 1900 00: 00: 00.000 (те, що ви отримуєте SELECT CONVERT(DATETIME, 0)), але фактичне мінімальне значення, яке може містити дата-час у SQL Server, насправді є 1753 р., Як пише OP. Ось тоді Америка також перейшла на григоріанський календар, і SQL Server не повинен мати справу з відсутніми днями і т. Д. SELECT CONVERT(DATETIME, -53690)Видає 1753-01-01 00:00:00.000та SELECT CONVERT(DATETIME, -53691)видає помилку про переповнення.
bugybunny

0

Це те, що я використовую для отримання мінімальної дати в SQL Server. Зверніть увагу, що це сприяє глобалізації:

CREATE FUNCTION [dbo].[DateTimeMinValue]()
RETURNS datetime
AS
BEGIN
  RETURN (SELECT
    CAST('17530101' AS datetime))
END

Телефонуйте за допомогою:

SELECT [dbo].[DateTimeMinValue]()

-1

Діапазон для datetimeне зміниться, оскільки це порушить зворотну сумісність. Тож ви можете жорстко його кодувати.


2
Це правда, але все одно було б непогано зателефонувати GetMinDate () або щось подібне замість CONVERT (datetime, '1753-1-1'), де б мені не потрібно було його використовувати.
Джеремі

@Jeremy: Я знаю, що convertробить, але для цього GetMinDate()мені доведеться заглибитися у визначення функції. Отже, якби мені довелося підтримувати ваш код, я віддав би перевагу convertваріанту.
Andomar

1
Ви можете знати, що convertробить, але не обов’язково знаєте значення 1753-1-1.
jwg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.