database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 2081 게시물 읽기
No. 2081
지난주 수요일에서 이번주 화요일까지 날짜계산
작성자
voy
작성일
2005-07-06 12:12
조회수
7,082

지난주 수요일에서 이번주 화요일까지 날짜계산입니다.

 

1. 무대뽀로다가..

declare @last_date datetime
select @last_date=convert(datetime,convert(varchar(10),getdate()-(datepart(dw,getdate())-4)))
select @last_date-7, @last_date

 

2. 좀 줄이려고 보니.. 변수를 datetime으로 잡으니 convert(datetime,..)를 안해도 알아서 들어가더군요..

declare @last_date2 datetime
select @last_date2=convert(varchar(10),getdate()-(datepart(dw,getdate())-4))
select @last_date2-7,@last_date2

 

3. 좀 더 줄여볼까하고..하니 left를 쓸 수가 있던데..

declare @last_date3 datetime
select @last_date3=left(getdate()-(datepart(dw,getdate())-4),10)
select @last_date3-7,@last_date3

 

여기서 이 left 녀석을 써도 무방할런지 모르겠습니다..

 

그리고, 어떤날의 date만 가져오는 그런 함수 없나싶어 질문 올립니다..

2005-07-06 12:17:01 이라는 시간을 2005-07-06 00:00:00 이렇게 만드는..

 

그리고.. 저 위에 1,2,3 이 실행계획은 비슷한데..

어떤것을 써야할지.. 추천을 좀.. ^^;;

 

p.s. 그 밖의 좋은 방법을 알려주시면 더욱 감사하겠습니다.. ^^;;

 


이 글에 대한 댓글이 총 7건 있습니다.

MS-SQL에서는 어떤날의 date만 가져오는 그런 함수는 없는 것으로

알고 있습니다.

필요하시다면  아래의 쿼리를 이용하여 사용자 정의 함수를 작성하여

사용하시면 됩니다.

SELECT  CONVERT(DATETIME,CONVERT(CHAR(10),GETDATE(),121))

 

 

가을남자님이 2005-07-06 18:24에 작성한 댓글입니다. Edit

getdate() 같은 비확정 값에 대한 udf 는 생성이 안되는걸로

아는데요....?

석이님이 2005-07-06 19:31에 작성한 댓글입니다. Edit

석이님의 지적이 맞습니다.
사용자함수에서는 비확정인 함수를 사용할 수 없습니다.(좋은 지적 감사합니다.)
예제가 부적절했습니다.(죄송, 꾸벅)

아래의 예제에서와 같이 날짜값을 확정된 형태로 사용자 정의 함수를 이용하신다면
원하시는 결과를 얻을 수 있습니다.(이번에는 Test해 보았습니다.)

CREATE FUNCTION dbo.UFN_GETDATE(@time datetime)
RETURNS datetime
 AS
BEGIN
     DECLARE @date datetime

    SELECT @date= CONVERT(datetime,CONVERT(char(10),@time,112));
   
    RETURN( @date);
END
GO

SELECT  dbo.UFN_GETDATE(getdate());


----------------------------------------------------------------------------
이야기가 나온 김에 정리를 하면 사용자 정의 함수 본문에서 사용할 수 있는 구문은
아래만 가능하고 그 외에는 에러가 발생합니다.(BOL의 CREATE FUNCTION 부분 참조)

1. 할당 문(SET)
2. 흐름 제어 문
3. 함수에서 로컬로 사용되는 데이터 변수와 커서를 정의하는 DECLARE 문
4. 함수에서 로컬로 사용되는 변수에 값을 할당하는 식이 있는 선택 목록이 포함된 SELECT 문
5. 함수에서 커서 선언, 열기, 닫기, 할당 취소 등 로컬 커서를 참조하는 커서 작업. INTO 절을 사용하여
   로컬 변수에 값을 할당하는 FETCH 문만 허용되며 클라이언트에게 데이터를 반환하는 FETCH 문은 사용할
   수 없습니다.
6. 함수에서 로컬로 사용되는 table 변수를 수정하는 INSERT, UPDATE, DELETE 문
7. 확장 저장 프로시저를 호출하는 EXECUTE , 만약 수행하는 확장 프로시져가 반환값을 가지고 있다면 실패
   합니다.


또한 기본적으로 제공되는 함수들 중에서도 그 결과가 확정적이지 않은 아래의 함수들은 사용할 수 없습니다.
 (더 자세한 함수 목록은 BOL의 확정적 함수 및 비확정적 함수 참조 하세요)
 1. @@CONNECTIONS        2. @@TOTAL_ERRORS
 3. @@CPU_BUSY           4. @@TOTAL_READ
 5. @@IDLE               6. @@TOTAL_WRITE
 7. @@IO_BUSY            8. GETDATE
 9. @@MAX_CONNECTIONS   10. GETUTCDATE
11. @@PACK_RECEIVED     12. NEWID
13. @@PACK_SENT         14. RAND
15. @@PACKET_ERRORS     16.TEXTPTR
17. @@TIMETICKS  

 

 

 * 함수가 확정적인지 또는 비확정적인지 여부를 함수의 명확성이라고 하면,
   함수 호출시의 결과의 동일성으로 판단할 수 있습니다. (BOL의 확정적 함수 및 비확정적 함수 참조)
  1. 확정적 함수는 특정 입력 값을 사용하여 호출될 때마다 항상 같은 결과를 반환합니다.
  2. 비확정적 함수는 특정 입력 값을 사용하여 호출될 때마다 다른 결과를 반환할 수 있습니다.

 

 

 

가을남자님이 2005-07-07 01:00에 작성한 댓글입니다. Edit

정리 정말 감사합니다. ^^;

 

석이님이 2005-07-07 01:06에 작성한 댓글입니다. Edit

웹에서도 편하게 쓰기 위해 편집좀 했습니다.

^-^

 

 

CREATE FUNCTION dbo.UFN_showdate(@time datetime)
RETURNS char(14)
AS
BEGIN
     DECLARE @date char(14)

    SELECT @date= replace(replace(replace(convert(char(20),@time,120),'-',''),':',''),' ','')
    
    RETURN( @date);
END
GO

-- drop function dbo.UFN_showdate

select dbo.ufn_showdate(getdate())

라는 함수를 만들어 두고
showdate 라는 asp 펑션을 만들어 function 집단에 넣어두고
오늘 날짜 이라면 시간만 표시해 주고
오늘이 아니라면 날짜를 리턴하는 함수를 만들어 준다.


'날짜 치환
Function ShowDate(dat)        
        '//오늘 날짜라면 시간만 보여줌
        If Left(dat,8) = tmptime Then
                Response.Write "<font color='#FF6215'><b>" & Mid(dat,9,2) & ":" & Mid(dat,11,2) & "</b></font>"
        Else
                Response.Write Left(dat,4) & "/" & Mid(dat,5,2) & "/" & Mid(dat,7,2)
        End If
End Function

Function ShowDate2(dat)
        
        '//오늘 날짜라면 시간만 보여줌
        If Left(dat,8) = tmptime Then
                Response.Write "<font color='#FF6215'><b>" & Mid(dat,9,2) & ":" & Mid(dat,11,2) & "</b></font>"
        Else
                Response.Write Mid(dat,5,2) & "/" & Mid(dat,7,2)
        End If
End Function

'// 전체 날짜 형식
Function DetailDate(dat)
                Response.Write Left(dat,4) & "." & Mid(dat,5,2) & "." & Mid(dat,7,2) & " " & Mid(dat,9,2) & ":" & Mid(dat,11,2)
End Function

석이님이 2005-07-07 01:22에 작성한 댓글입니다. Edit

 

두 분 모두 감사합니다. ^^*

 

일자만 나오는 사용자 정의함수..

일자만 뽑아내는 함수도 편하겠고..

매주 일정한 요일에 일주일 단위로 데이터를 뽑아야 한다면

시작요일이나 마지막 요일을 넣고 날짜를 뽑아내는 함수도 편할듯하네요..

 

전 이 DB에서 일자만 뽑아내는 경우가 이번 한번이라

사용자 정의함수를 만들 생각은 아예 안했더랬습니다.

사용자 정의함수...

아직은 만들어야할지 말아야할지 기준을 모르겠습니다.

만들어놓으면 편하겠지만.. '기회비용' 이란게 있지않습니까? =_=;;

사용자 정의 함수에 대해 연구(?)를 좀 해봐야겠습니다.

 

그럼 모두 좋은 하루되세요~  ^^

 

 

voy님이 2005-07-07 10:26에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
2084Microsoft OLE DB Provider for SQL Server error '80004005' [1]
이동근
2005-07-07
3572
2083sp_attach_single_file_db 사용중.. [1]
mssql
2005-07-07
2419
2082... [3]
매커
2005-07-06
2182
2081지난주 수요일에서 이번주 화요일까지 날짜계산 [7]
voy
2005-07-06
7082
2080초보질문드립니다 [2]
정두호
2005-07-06
2384
2079DateTime형이 load data infile ~ replace 시에 ZERO value로 기록이되서.. [1]
이진
2005-07-06
2667
2078빠른 like 검색 문의 [2]
김민재
2005-07-05
8640
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다