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
'programing' 카테고리의 다른 글
FutureWarning: 저장이 Python의 공용 API의 일부가 아닙니다. (0) | 2023.07.09 |
---|---|
오라클 저장 프로시저를 어떻게 인쇄합니까(디버깅 목적)? (0) | 2023.07.09 |
전역 제외 패턴 (0) | 2023.07.04 |
다른 워크북을 연 후 Excel이 매크로를 완료하지 않음 (0) | 2023.07.04 |
Visual Studio 2015에서 .sass 파일을 저장하여 컴파일하는 방법 (0) | 2023.07.04 |