programing

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

yellowcard 2023. 4. 20. 20:46
반응형

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

datetime의 최소값(1753년 1월 1일)을 반환하는 SQL Server 함수를 찾고 있습니다.날짜 값을 스크립트에 하드코드하지 않는 것이 좋습니다.

그런 게 있나요? (비교하기 위해 C#에서는 그냥 할 수 있어요)DateTime.MinValue)아니면 제가 직접 써야 하나요?

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

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

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

SqlDateTime 오브젝트 보셨나요?사용하다SqlDateTime.MinValue최소 날짜(1753년 1월 1일)를 취득합니다.

인정된 답변에 대해서는 평판이 좋지 않아 코멘트를 드릴 수 없기 때문에 답변으로 보내드립니다.

사용방법select cast('1753-1-1' as datetime)는, YYY-MM-DD 형식의 데이터 스트링을 수신할 수 없는 지역 설정의 데이타베이스상에서 동작하고 있는 경우,

대신 를 사용합니다.select cast(-53690 as datetime)또는Convert지정된 날짜/시간 형식을 사용합니다.

기본 값으로 날짜 입력'yyyymmdd'지역 문제를 피하기 위해:

select cast('17530101' as datetime)

네, TSQL이 다음과 같은 서비스를 제공받았으면 좋겠습니다.MinDate() = '00010101'하지만 그런 행운은 없다.

다음은 최소 날짜 값을 가져오는 빠르고 읽기 쉬운 방법입니다.

주의: 이것은 결정론적 함수이므로 성능을 더욱 향상시키려면 반환값에 WITH SCHEMABINDIND를 적용하는 것이 좋습니다.

함수를 만듭니다.

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

1753년 1월 1일이 아니라 datetime에 표시되는 cast("")를 선택합니다.이 경우 1900-01-01 00:00:00.000은 SQL Server에 의한 기본값을 제공합니다.(어쨌든 초기화되지 않은 것 같습니다.)

SQL Server에서 최소 날짜를 얻기 위해 사용하는 것입니다.세계화에 도움이 되는 것에 주의해 주세요.

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

콜 방법:

SELECT [dbo].[DateTimeMinValue]()

다음은 어떻습니까?

declare @dateTimeMin as DATETIME = datefromparts(1753, 1, 1);
select @dateTimeMin;

면책사항:다음 코드는 예쁘지 않습니다.Try/Catch 스테이트먼트에 의존하는 것은 좋은 방법이 아닙니다.또한 기능에는 Try/Catch 문장이 포함되지 않을있으므로 원래 포스터의 기능 요구 사항을 충족하지 않습니다.

즉, 다음 SQL 코드매직 숫자를 사용하지 않고 최소 날짜 또는 최대 날짜(bonus)를 제공합니다.루프에 넣지 않는 한 속도는 문제가 되지 않습니다.여기에 기술문을 한 줄의 코드로 표시하므로 많은 공간을 소모하지 않고 메인 SP 자체에서 주의를 분산시키지 않고 쉽게 복사/붙여넣기 및 저장 프로시저에 삽입할 수 있습니다.

DECLARE @MinDate DATETIME = CONVERT(DATETIME, 0); BEGIN TRY WHILE (1=1) BEGIN SELECT @MinDate = DateAdd(YEAR, -1, @MinDate); END END TRY BEGIN CATCH END CATCH;
SELECT @MinDate

DECLARE @MaxDate DATETIME = GETDATE(); BEGIN TRY WHILE (1=1) BEGIN SET @MaxDate = DATEADD(YEAR,1,@MaxDate); END END TRY BEGIN CATCH END CATCH; BEGIN TRY WHILE (1=1) BEGIN SET @MaxDate = DATEADD(MONTH,1,@MaxDate); END END TRY BEGIN CATCH END CATCH; BEGIN TRY WHILE (1=1) BEGIN SET @MaxDate = DATEADD(DAY,1,@MaxDate); END END TRY BEGIN CATCH END CATCH; BEGIN TRY WHILE (1=1) BEGIN SET @MaxDate = DATEADD(HOUR,1,@MaxDate); END END TRY BEGIN CATCH END CATCH; BEGIN TRY WHILE (1=1) BEGIN SET @MaxDate = DATEADD(MINUTE,1,@MaxDate); END END TRY BEGIN CATCH END CATCH; BEGIN TRY WHILE (1=1) BEGIN SET @MaxDate = DATEADD(SECOND,1,@MaxDate); END END TRY BEGIN CATCH END CATCH; BEGIN TRY WHILE (1=1) BEGIN SET @MaxDate = DATEADD(ms,3,@MaxDate); END END TRY BEGIN CATCH END CATCH;
SELECT @MaxDate

" " 의 datetime이전 버전과의 호환성이 깨지기 때문에 변경되지 않습니다.하드코드 할 수 있어요.

언급URL : https://stackoverflow.com/questions/3825893/sql-server-function-to-return-minimum-date-january-1-1753

반응형