SQL Server函数返回最小日期(1753年1月1日)


91

我正在寻找一个SQL Server函数来返回日期时间的最小值,即1753年1月1日。我不希望将该日期值硬编码到脚本中。

有没有类似的东西存在?(为了进行比较,在C#中,我可以这样做,DateTime.MinValue) 还是我必须自己写这个?

我正在使用Microsoft SQL Server 2008 Express。


2
只是好奇:您为什么打算完全使用该日期,而不是让该列为NULL?
乔·斯特凡内利

1
你可以使用CONVERT(smalldatetime, 0)smalldatetime
加布

5
CONVERT(smalldatetime,0)或CONVERT(datetime,0)或cast(0作为datetime)不是datetime的最小值
Gennady VaninГеннадийВанин2010年

2
@Joe:该列不允许NULL值,并且由于我未创建此表,因此我不想更改它。
杰里米

Answers:


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
Gabe 2010年

6
函数名称将使值的含义显而易见。
RedFilter 2010年

3
即使在SQL Server 2012中也没有函数来获取类似于getdate()的最小日期,因此上述方法是唯一可能的解决方案。这适用于在sql Server 2012相关解决方案中寻求更好解决方案的任何人。
拉姆

1
只需使用DateTime2(7)。它精确地映射到.NET DateTime类型。使用sql'datetime'就像使用'varchar'而不是'nvarchar'一样糟糕。'nvarchar'与.NET字符串类型对齐。相同的想法。然后,您可以随处使用DateTime.MinValue。
Triynko'2

2
如下面的弗兰克·吉利奇(Frank Gillich)所述,cast('17530101' as datetime)这还将避免区域性问题,并且比-53690更具可读性。
吉姆(Jim)

29

您看过SqlDateTime对象吗?用于SqlDateTime.MinValue获取您的最短日期(1753年1月1日)。


32
这需要是一个SQL函数,而不是.NET函数。
杰里米

5
尽管SqlDateTime.MinValue很有用,但将其作为答案是欺骗性的。@Jeremy要求的是本地sql函数,而不是.NET类库中的内容
Evan

6
再加上一个与此类似的问题,但在.Net上下文中不是SQL,这有帮助。
。– t_plusplus 2014年

也许你实际上可以通过使用新的实现这个U型SQL
康培

13

由于信誉不足,我无法对接受的答案发表评论,我的评论是作为答复。

select cast('1753-1-1' as datetime)如果在区域设置不接受YYYY-MM-DD格式的日期字符串的数据库上运行,则使用会失败。

而是使用带有指定日期时间格式的select cast(-53690 as datetime)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

不是1753年1月1日,而是选择cast(''作为datetime)来显示:1900-01-01 00:00:00.000给出了SQL Server的默认值。(反正我看起来还没有初始化)


1
这是不正确的。基本datetime是1900年1月1日00:00:00.000(您将获得SELECT CONVERT(DATETIME, 0)),但是datetime在SQL Server中可以保留的实际最小值实际上是OP编写的1753年。那时美国也改用公历日历,而SQL Server不必处理丢失的日期等。SELECT CONVERT(DATETIME, -53690)给出1753-01-01 00:00:00.000SELECT 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')。
杰里米

@杰里米:我知道是convert做什么的,但是因为GetMinDate()我必须深入研究函数定义。因此,如果我必须维护您的代码,则希望使用该convert变体。
安多玛

1
您可能知道会做什么convert,但不一定知道的重要性1753-1-1
jwg 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.