programing

SQL 서버에 날짜 저장

testmans 2023. 7. 4. 21:46
반응형

SQL 서버에 날짜 저장

SQL Server에서 DATTIME을 두 번째/분/시간/일/년으로 "플로어"하려면 어떻게 해야 합니까?

2008-09-17 12:56:53.430의 날짜가 있다고 가정하면 바닥재의 출력은 다음과 같습니다.

  • 연도: 2008-01-0100:00:00.000
  • 월: 2008-09-01 00:00.000
  • 일: 2008-09-1700:00.000
  • 시간: 2008-09-17 12:00:00.000
  • 분: 2008-09-17 12:56:00.000
  • 두 번째: 2008-09-17 12:56:53.000

핵심은 적절한 SQL 시간 범위 열거와 함께 DATEADD DATEIFF를 사용하는 것입니다.

declare @datetime datetime;
set @datetime = getdate();
select @datetime;
select dateadd(year,datediff(year,0,@datetime),0);
select dateadd(month,datediff(month,0,@datetime),0);
select dateadd(day,datediff(day,0,@datetime),0);
select dateadd(hour,datediff(hour,0,@datetime),0);
select dateadd(minute,datediff(minute,0,@datetime),0);
select dateadd(second,datediff(second,'2000-01-01',@datetime),'2000-01-01');
select dateadd(week,datediff(week,0,@datetime),-1); --Beginning of week is Sunday
select dateadd(week,datediff(week,0,@datetime),0); --Beginning of week is Monday

두 번째로 바닥을 칠 때 0을 사용하면 산술 오버플로가 발생하는 경우가 많습니다.따라서 플로어링하려는 날짜 시간보다 낮을 것으로 보장되는 알려진 값을 선택합니다.

SQL Server에는 다음과 같은 이점이 있습니다.

SELECT CAST(FLOOR(CAST(CURRENT_TIMESTAMP AS float)) AS DATETIME)

날짜 시간을 플로트에 캐스팅하면 날짜가 정수 부분으로 표시되고 시간이 경과한 날짜의 부분으로 표시됩니다.소수점 부분을 잘라낸 다음 날짜 시간으로 다시 돌려보내면 그 날이 시작될 때 자정이 됩니다.

이것은 아마도 모든 DATEADD와 DATEIF보다 더 효율적일 것입니다.확실히 타이핑하기가 훨씬 쉽습니다.

마이크로소프트 SQL 서버 2008에서 Convert/Cast 솔루션을 확장하면 다음 작업을 수행할 수 있습니다.

cast(cast(getdate() as date) as datetime)

교체하기만 하면 됩니다.getdate()날짜 시간인 임의의 열을 사용합니다.

이 변환에 관련된 문자열이 없습니다.

이것은 임시 쿼리나 업데이트에는 적합하지만 키 조인이나 많이 사용되는 처리의 경우 적절한 키와 데이터를 갖도록 테이블을 재정의하거나 처리 내에서 변환을 처리하는 것이 더 나을 수 있습니다.

2005년에는 메시에 플로어를 사용할 수 있습니다.cast(floor(cast(getdate() as float)) as datetime)

저는 그것도 문자열 변환을 사용한다고 생각하지 않지만, 실제 효율과 안락의자 추정치를 비교하는 것은 말할 수 없습니다.

저는 몇 년 동안 바닥재 날짜를 기준으로 @Portman의 답변을 여러 번 사용했으며 유용할 수 있는 기능으로 작업을 옮겼습니다.

저는 그것의 성능에 대해 어떠한 주장도 하지 않으며 단지 사용자를 위한 도구로 제공할 뿐입니다.

만약 당신이 이 답변을 지지하기로 결정한다면, 제 코드는 그의 파생물이기 때문에 @Portman의 답변도 지지해 주시기를 요청합니다.

IF OBJECT_ID('fn_FloorDate') IS NOT NULL DROP FUNCTION fn_FloorDate
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[fn_FloorDate] (
  @Date DATETIME = NULL,
  @DatePart VARCHAR(6) = 'day'
)
RETURNS DATETIME
AS
BEGIN
  IF (@Date IS NULL)
    SET @Date = GETDATE();

  RETURN
  CASE
    WHEN LOWER(@DatePart) = 'year' THEN DATEADD(YEAR, DATEDIFF(YEAR, 0, @Date), 0)
    WHEN LOWER(@DatePart) = 'month' THEN DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date), 0)
    WHEN LOWER(@DatePart) = 'day' THEN DATEADD(DAY, DATEDIFF(DAY, 0, @Date), 0)
    WHEN LOWER(@DatePart) = 'hour' THEN DATEADD(HOUR, DATEDIFF(HOUR, 0, @Date), 0)
    WHEN LOWER(@DatePart) = 'minute' THEN DATEADD(MINUTE, DATEDIFF(MINUTE, 0, @Date), 0)
    WHEN LOWER(@DatePart) = 'second' THEN DATEADD(SECOND, DATEDIFF(SECOND, '2000-01-01', @Date), '2000-01-01')
    ELSE DATEADD(DAY, DATEDIFF(DAY, 0, @Date), 0)
  END;
END

용도:

DECLARE @date DATETIME;
SET @date = '2008-09-17 12:56:53.430';

SELECT
  @date AS [Now],--2008-09-17 12:56:53.430
  dbo.fn_FloorDate(@date, 'year') AS [Year],--2008-01-01 00:00:00.000
  dbo.fn_FloorDate(default, default) AS [NoParams],--2013-11-05 00:00:00.000
  dbo.fn_FloorDate(@date, default) AS [ShouldBeDay],--2008-09-17 00:00:00.000
  dbo.fn_FloorDate(@date, 'month') AS [Month],--2008-09-01 00:00:00.000
  dbo.fn_FloorDate(@date, 'day') AS [Day],--2008-09-17 00:00:00.000
  dbo.fn_FloorDate(@date, 'hour') AS [Hour],--2008-09-17 12:00:00.000
  dbo.fn_FloorDate(@date, 'minute') AS [Minute],--2008-09-17 12:56:00.000
  dbo.fn_FloorDate(@date, 'second') AS [Second];--2008-09-17 12:56:53.000

사용하는 스타일에 따라 CONVERT() 기능도 사용할 수 있습니다.

Oracle이 아닌 것이 아쉽습니다. 그렇지 않으면 trunc() 또는 to_char()를 사용할 수 있습니다.

하지만 SQL Server와 유사한 문제가 있었고 여기서 참조한 것처럼 CONVERT() 및 DateDiff() 메서드를 사용했습니다.

이 고양이의 가죽을 벗기는 방법은 여러 가지가 있습니다 =)

select convert(datetime,convert(varchar,CURRENT_TIMESTAMP,101))

DateDiff와 함께 DateAdd를 사용하면 다양한 작업을 수행할 수 있습니다.예를 들어, 모든 달의 마지막 날을 찾을 수 있으며 이전 또는 다음 달의 마지막 날도 찾을 수 있습니다.

----Last Day of Previous Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0))
LastDay_PreviousMonth
----Last Day of Current Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))
LastDay_CurrentMonth
----Last Day of Next Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+2,0))
LastDay_NextMonth

원천

포스트그레 이후SQL은 "SQL 서버"이기도 합니다.

date_trunc()

당신이 요구하는 것을 우아하게 해주는군요.

예:

date_hour', current_hour) 선택;
날짜_날짜------------------------2009-02-18 07:00:00-08(1행)

Databrix SQL에서 이 작업을 수행하려는 사용자는 다음과 같은 작업을 수행할 수 있습니다.

SELECT make_date(date_part('YEAR', date_field), date_part('MONTHS', date_field), 1) AS floor_date

이렇게 하면 '2022-10-26'과 같은 항목이 '2022-10-01'로 변환됩니다.사용할 수도 있습니다.date_part() 및/또는 초를 추출하려면: https://docs.databricks.com/sql/language-manual/functions/date_part.html .

언급URL : https://stackoverflow.com/questions/85373/floor-a-date-in-sql-server

반응형