2016-02-11 6 views
1

Я знаю, что SQL Server date datatype определен как диапазон от 0001-01-01 до 9999-12-31. Есть ли способ получить эти значения с использованием T-SQL без использования магических чисел (например, без чего-то вроде declare @MaxDate date = '12/31/9999')?SQL Server: получите максимальную/минимальную дату без магических чисел

+2

Что вы подразумеваете под «принуждением этих ценностей»? – Lamak

+0

Получите, извините! Плохой выбор слов - редактирование на мгновение :) – Conduit

+0

Он по-прежнему не уточняет, что вы хотите сделать. Когда вам нужно получить эти ценности? – Lamak

ответ

1

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

Вы можете сделать это с типом даты и времени:

SELECT CAST(0 AS datetime) 
--returns 1900-01-01 00:00:00.000 

Но вы не можете сделать это с типом дата:

SELECT CAST(0 AS date) 
--returns Msg 529, Level 16, State 2, Line 1 
--Explicit conversion from data type int to date is not allowed. 
+0

Жаль. Нечетный выбор, все рассмотренное - намерение довольно очевидно. Похоже, что максимум [недоступен] (http://stackoverflow.com/questions/548353/finding-max-possible-date-in-ms-sql-server-2005) ... – Conduit

0

Существует своего рода кружным путем получения. Но вы могли бы сделать это:

DECLARE @dateHighest nvarchar(400), @dateLowest nvarchar(400) 

SET @dateHighest = 'powershell.exe ((([System.Data.SqlTypes.SqlDateTime]::MaxValue).Value).ToString(\""MM/dd/yyyy\""))' 

SET @dateLowest = 'powershell.exe ((([System.Data.SqlTypes.SqlDateTime]::MinValue).Value).ToString(\""MM/dd/yyyy\""))' 

DECLARE @useTopDate table 
(
    highestDate date 
) 

DECLARE @useBottomDate table 
(
    lowestDate date 
) 


INSERT INTO @useBottomDate EXEC xp_cmdshell @dateLowest 
INSERT INTO @useTopDate EXEC xp_cmdshell @dateHighest 

SELECT TOP 1 * From @useTopDate, @useBottomDate 

Если вам это нужно в Хранимой Proc или функции, вы можете использовать его позже.

+0

Это получит CLR мин/макс, не обязательно для SQL Server. –

+0

@ DanField, yep согласно примечанию в конце, но в большинстве случаев они должны быть одинаковыми, просто не уверены в этом случае для этого. –

+0

Они не совпадают для MinValue в 'Datetime' (но они предназначены для« даты »). Это может сработать лучше, если вы запустили свой PS в '' powershell.exe (([System.Data.SqlTypes.SqlDateTime] :: MaxValue ... »и MinValue. См. Http://stackoverflow.com/questions/3310569/what -is-the-value-of-1-1-1753-in-sql-server –

0

Так это не работает без номеров магии, но если вам нужны функции (я использовал шестигранное обозначение, как это немного более компактные и легкие для чтения для чисел это большое)

SELECT CAST(CAST(CAST(0x2D247f AS BIGINT) AS DATETIME) AS DATE) --, CAST(0x2D247f AS BIGINT) 
SELECT CAST(CAST(CAST(0xD1BA AS BIGINT) * -1 AS DATETIME) AS DATE) --, CAST(0xD1BA AS BIGINT) * -1 

Хотя, на нижний конец, SQL Server позволит 1/1/1:

SELECT CAST('0001-01-01' AS DATE) 

Но не отрицательные даты (например, BC).

Смежные вопросы