Я ищу функцию SQL Server, которая бы возвращала минимальное значение для datetime, а именно 1 января 1753 г. Я бы предпочел не закодировать это значение даты в моем скрипте.
Что-нибудь подобное существует? (Для сравнения, на C # я мог бы просто сделать DateTime.MinValue)
Или мне пришлось бы написать это самому?
Я использую Microsoft SQL Server 2008 Express.
sql-server
datetime
function
Джереми
источник
источник
CONVERT(smalldatetime, 0)
дляsmalldatetime
.Ответы:
Вы можете написать функцию, определяемую пользователем, которая возвращает значение минимальной даты следующим образом:
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
источник
'1753-1-1'
это намного лучше, чем-53690
cast('17530101' as datetime)
он также избегает региональных проблем и немного более читабелен, чем -53690.Вы видели объект SqlDateTime ? используйте,
SqlDateTime.MinValue
чтобы получить минимальную дату (1 января 1753 г.).источник
Поскольку я не могу прокомментировать принятый ответ из-за недостаточной репутации, мой комментарий является ответом.
использование
select cast('1753-1-1' as datetime)
означает сбой, если запускается в базе данных с региональными настройками, не принимающими строку даты в формате ГГГГ-ММ-ДД.Вместо этого используйте
select cast(-53690 as datetime)
илиConvert
с указанным форматом даты и времени.источник
Введите дату как собственное значение,
'yyyymmdd'
чтобы избежать региональных проблем:select cast('17530101' as datetime)
Да, было бы здорово, если бы был TSQL
MinDate() = '00010101'
, но не тут-то было .источник
Вот быстрый и легко читаемый способ получить минимальное значение даты
Примечание: это детерминированная функция , поэтому для дальнейшего повышения производительности мы могли бы также применить WITH SCHEMABINDING к возвращаемому значению.
Создать функцию
CREATE FUNCTION MinDate() RETURNS DATETIME WITH SCHEMABINDING AS BEGIN RETURN CONVERT(DATETIME, -53690) END
Вызов функции
Пример 1
Пример 2
Пример 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
источник
Это не 1 января 1753 года, но выберите cast ('' as datetime), который показывает: 1900-01-01 00: 00: 00.000 дает значение по умолчанию для SQL-сервера. (В любом случае, для меня это выглядит более неинициализированным)
источник
SELECT CONVERT(DATETIME, 0)
), но фактическое минимальное значение, которое datetime может содержать в SQL Server, на самом деле находится в 1753 году, что написал OP. Именно тогда Америка также перешла на григорианский календарь, и SQL Server не должен иметь дело с пропущенными днями и т. Д.SELECT CONVERT(DATETIME, -53690)
Выдает1753-01-01 00:00:00.000
иSELECT CONVERT(DATETIME, -53691)
выдает ошибку о переполнении.Это то, что я использую для получения минимальной даты в SQL Server. Обратите внимание, что это подходит для глобализации:
CREATE FUNCTION [dbo].[DateTimeMinValue]() RETURNS datetime AS BEGIN RETURN (SELECT CAST('17530101' AS datetime)) END
Звоните, используя:
SELECT [dbo].[DateTimeMinValue]()
источник
Диапазон для
datetime
не изменится, так как это нарушит обратную совместимость. Так что вы можете жестко это закодировать.источник
convert
делает, ноGetMinDate()
мне пришлось бы углубиться в определение функции. Так что, если бы мне пришлось поддерживать ваш код, я бы предпочелconvert
вариант.convert
делает, но не обязательно знать значение1753-1-1
.