최소 날짜를 반환하는 SQL Server 함수 (1753 년 1 월 1 일)


93

날짜 시간의 최소값, 즉 1753 년 1 월 1 일을 반환하는 SQL Server 함수를 찾고 있습니다. 해당 날짜 값을 스크립트에 하드 코딩하지 않고 싶습니다.

그런 것이 있습니까? (비교를 위해 C #에서는 그냥 할 수 DateTime.MinValue) 있거나 직접 작성해야합니까?

Microsoft SQL Server 2008 Express를 사용하고 있습니다.


2
궁금한 점 : 열을 대신 NULL로 두는 대신 해당 날짜를 사용하려는 이유는 무엇입니까?
Joe Stefanelli

1
당신은 사용할 수 있습니다 CONVERT(smalldatetime, 0)에 대한 smalldatetime.
Gabe

5
CONVERT (smalldatetime, 0) 또는 CONVERT (datetime, 0) 또는 cast (0 as datetime)는 datetime의 최소값이 아닙니다.
Gennady Vanin Геннадий Ванин

2
@Joe : 열은 NULL 값을 허용하지 않으며이 테이블을 만들지 않기 때문에 변경하고 싶지 않습니다.
제레미

답변:


93

다음 과 같이 최소 날짜 값을 반환 하는 사용자 정의 함수 를 작성할 수 있습니다 .

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

56
만약 당신이 임의의 상수를 가지게된다면, '1753-1-1'훨씬 낫습니다-53690
Gabe

6
함수 이름은 값의 의미를 분명하게합니다.
RedFilter

3
SQL Server 2012에서도 getdate ()와 유사한 최소 날짜를 가져 오는 기능이 없으므로 위의 유일한 솔루션이 있습니다. 이것은 SQL Server 2012 관련 솔루션에서 더 나은 솔루션을 찾고있는 모든 사람을위한 것입니다.

1
DateTime2 (7)을 사용하십시오. .NET DateTime 유형에 정확히 매핑됩니다. SQL 'datetime'을 사용하는 것은 'nvarchar'대신 'varchar'를 사용하는 것보다 나쁩니다. 'nvarchar'는 .NET 문자열 유형과 일치합니다. 같은 생각. 그런 다음 모든 곳에서 DateTime.MinValue를 사용할 수 있습니다.
Triynko

2
아래 Frank Gillich가 언급했듯이 cast('17530101' as datetime)지역 문제도 피할 수 있으며 -53690보다 약간 더 읽기 쉽습니다.
Jim

29

당신은 본 적이 SqlDateTime 개체를 ? SqlDateTime.MinValue최소 날짜를 얻으려면 사용 하십시오 (1753 년 1 월 1 일).


33
.NET 함수가 아니라 SQL 함수 여야합니다.
Jeremy

5
SqlDateTime.MinValue가 유용하지만 이것을 답으로 사용하는 것은 기만적입니다. @Jeremy는 .NET의 클래스 라이브러리에있는 것이 아니라 네이티브 SQL 함수를 요구하고 있습니다
Evan

6
이것에 대한 하나는 비슷한 질문에 도움이되었지만 SQL이 아닌 .Net 컨텍스트에서 도움이되었습니다. 이 질문의 경우처럼 ..
t_plusplus 2014-04-24

새로운 U-SQL
Kapé

14

평판 포인트가 불충분하여 받아 들여진 답변에 대해 댓글을 달 수 없어 댓글로 답장이 나옵니다.

select cast('1753-1-1' as datetime)YYYY-MM-DD 형식의 날짜 문자열을 허용하지 않는 지역 설정으로 데이터베이스에서 실행하면를 사용하면 실패합니다.

대신 지정된 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

1753 년 1 월 1 일이 아니지만 cast ( ''as datetime)를 선택하면 다음과 같이 표시됩니다. 1900-01-01 00 : 00 : 00.000은 SQL 서버에서 기본값을 제공합니다. (어쨌든 나에게는 더 초기화되지 않은 것 같습니다)


2
이것은 올바르지 않습니다. 기본 datetime은 1 Jan 1900 00 : 00 : 00.000 (당신이 얻는 것 SELECT CONVERT(DATETIME, 0))이지만 datetime이 SQL Server에서 보유 할 수있는 실제 최소값은 실제로 OP가 작성한 1753입니다. 미국은 또한 그레고리력으로 전환하고 SQL 서버 등없는 일을 처리 할 필요가 없다의 그 SELECT CONVERT(DATETIME, -53690)제공 1753-01-01 00:00:00.000SELECT CONVERT(DATETIME, -53691)오버 플로우에 대한 오류를 제공합니다.
bugybunny 2011

0

이것은 SQL Server에서 최소 날짜를 얻는 데 사용하는 것입니다. 세계화 친화적입니다.

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

다음을 사용하여 전화 :

SELECT [dbo].[DateTimeMinValue]()

-1

범위는 datetime이전 버전과의 호환성을 손상 시키므로 변경되지 않습니다. 따라서 하드 코딩 할 수 있습니다.


2
그것은 사실이지만, 내가 그것을 사용해야 할 때마다 CONVERT (datetime, '1753-1-1') 대신 GetMinDate () 또는 이와 유사한 것을 호출하는 것이 여전히 좋을 것입니다.
제레미

@Jeremy : 무엇을하는지 알고 convert있지만 GetMinDate()함수 정의에 대해 자세히 알아보아야 합니다. 따라서 코드를 유지해야한다면 convert변형을 선호합니다 .
Andomar

1
무엇을하는지 알 수 convert있지만 1753-1-1.
jwg 2014 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.