문제

SQL 서버에서 사용할 수 있습니다 DATENAME 를 얻을 수있는 기능을 하루의 주 문자열로

declare @date datetime
set @date = '12/16/08'
select datename(dw, @date)

는 반환합니다"토요일"

고 사용할 수 있는 부분 함수의 일을 얻기 위하여 주로 정수

declare @date datetime
set @date = '12/16/08'
select datepart(dw, @date)

는 반환 3

하지만 말이 있 varchar 는 문자열이 포함되"토요일"고 싶으로 변환을 그것의 정수의 표현이 3.야,내가 쓸 수 있는 변환없이 많은 번거롭지만 내가 많은 오히려 내에서 기능이다.는 이런 기능이 존재하는가?

도움이 되었습니까?

해결책

함수를 쓰지 않고 설명과 숫자 값으로 요일 테이블을 만들어야합니다. 그런 다음 단순히 테이블에 가입하여 숫자를 얻을 수 있습니다.

그리고 며칠이 여러 가지 방법으로 저장되어 있다면 (캐릭터 기반 시스템에서 아마도) 모든 변형을 테이블에 넣을 수 있으므로 화요일은 모두 같은 정수에 매핑 될 것입니다.

다른 팁

불행히도 기능이 내장되어 있지 않지만 다음과 같이 직접 만들 수 있습니다.


CREATE FUNCTION dbo.WeekDay(@DayOfWeek Varchar(9))
RETURNS INT
            AS
    BEGIN
    DECLARE @iDayofWeek INT
    SELECT @iDayofWeek = CASE @DayOfWeek
                    WHEN 'Sunday' THEN 1
                    WHEN 'Monday' THEN 2
                    WHEN 'Tuesday' THEN 3
                    WHEN 'Wednesday' THEN 4
                    WHEN 'Thursday' THEN 5
                    WHEN 'Friday' THEN 6
                    WHEN 'Saturday' THEN 7
        END
    RETURN (@iDayofWeek)
    END
GO

6 년 후, 여러 버전의 SQL Server 버전이지만 여전히 내장 기능이 없습니다 (내가 아는 한). 확실하지 않습니다 이것을 할 것입니다.

나는 방금 @russbradberry와 비슷한 접근 방식을 취했습니다 IF 진술.

CREATE FUNCTION dbo.WeekDayInt (@DayOfWeekName VARCHAR(10))
RETURNS INT
AS
    BEGIN
        DECLARE @DayWeekNumber INT
        IF @DayOfWeekName = 'Sunday'    SET @DayWeekNumber = 1
        IF @DayOfWeekName = 'Monday'    SET @DayWeekNumber = 2
        IF @DayOfWeekName = 'Tuesday'   SET @DayWeekNumber = 3
        IF @DayOfWeekName = 'Wednesday' SET @DayWeekNumber = 4
        IF @DayOfWeekName = 'Thursday'  SET @DayWeekNumber = 5
        IF @DayOfWeekName = 'Friday'    SET @DayWeekNumber = 6
        IF @DayOfWeekName = 'Saturday'  SET @DayWeekNumber = 7;
        RETURN (@DayWeekNumber)
    END

또는 대안으로서 이런 식으로 수행 할 수 있습니다. 경기가 발생하자마자 값을 반환하고 다른 값을 평가하려고 시도하지 않기 때문에 조금 더 빠를 수 있습니다.

CREATE FUNCTION dbo.WeekDayInt (@DayOfWeekName VARCHAR(10))
RETURNS INT
AS
    BEGIN
        IF @DayOfWeekName = 'Sunday'    RETURN 1
        IF @DayOfWeekName = 'Monday'    RETURN 2
        IF @DayOfWeekName = 'Tuesday'   RETURN 3
        IF @DayOfWeekName = 'Wednesday' RETURN 4
        IF @DayOfWeekName = 'Thursday'  RETURN 5
        IF @DayOfWeekName = 'Friday'    RETURN 6
        IF @DayOfWeekName = 'Saturday'  RETURN 7;
        RETURN 0;
    END

여기에 더러운 대안을 내가 사용하는 경우 나는 그것을 실행하지 않는 사이에 대규모합니다.

    Select CHARINDEX(SUBSTRING('Thursday',1,3), 'MONTUEWEDTHUFRISATSUN') / 3 + 1

대체 목적으로 당신의 선택 또는 변수입니다.

그것이 어떻게 작동:SUBSTRING('월요일',1,3)기본적으로 만듭니다 Thu,그 반환을 위 목 문자열에서는 10.우리는 다음을 나눌 10 길이 우리의 하루는 단어입니 3 이는 동일 3,고 싶어 하기 때문에

금요일을 같 1 금요일을 같 2 금요일을 같 3 금요일을 같 4

추가 1 말

그래서 그 결과 4.

하는데 도움이 되는 사람,하지만 난 그것에 동의 아마 최고의 솔루션입니다.

참고:주문할 수도 있습니다 그 결과에 의해 설정 하루 번호를 사용하여 그것을 이렇게:

SELECT ID,DayNamesColumn from mytable ORDER BY CHARINDEX(SUBSTRING(DayNamesColumn ,1,3), 'MONTUEWEDTHUFRISATSUN') / 3 + 1

다음 선택을 사용하여 ISO 주중 서수를 얻을 수 있습니다. 2017-12-15 (예 : 현재의 첫날을 결정하는 @@ datefirst의 현재 설정과 관련하여). 예를 들어 월요일에 DateFirst = 1을 설정했습니다.

select
  w.weekday_id_iso8601,
  w.weekday_id_datepart,
  w.weekday_name
from (
       values
         (7, 'Monday'),
         (8, 'Tuesday'),
         (9, 'Wednesday'),
         (10, 'Thursday'),
         (11, 'Friday'),
         (12, 'Saturday'),
         (13, 'Sunday'))
     t(weekday_id, weekday_name)
cross apply (
  select
    t.weekday_id - 6 weekday_id_iso8601,
    (t.weekday_id - @@datefirst + 1) % 7 + 1 weekday_id_datepart,
    t.weekday_name
) w
where w.weekday_id_datepart = datepart(weekday, '2017-12-15')

조회 테이블 추가에 대한 답변에 동의하지 않습니다.이 경우 값은 제한되어 있으며 결코 변경되지 않습니다. 조회 테이블 조인은 비용을 추가합니다.

IMHO; 값이 제한되어 있으므로 내 견해에서 Case 문을 사용합니다. 예쁘지는 않지만 아마도 가장 빠른 방법 일 것입니다.

이것은 실용적인 목적으로 사용되지 않을 수도 있지만, 나는 단지 재미를 위해 그것을 알아낼 것이라고 생각했습니다. :) 다음 작품.

DatePart 또는 DateName을 사용할 때 @@ dateFirst의 값이 중요하고 결과를 변경할 수 있음을 기억하십시오. 온라인 도움말에서 날짜를 설정하십시오.

DECLARE
    @date_name AS VARCHAR(20)

SET @date_name = 'Monday'

SELECT
    DATEPART(dw, my_date)
FROM
    (
    SELECT CAST('1900-01-01' AS DATETIME) AS my_date UNION
    SELECT CAST('1900-01-02' AS DATETIME) AS my_date UNION
    SELECT CAST('1900-01-03' AS DATETIME) AS my_date UNION
    SELECT CAST('1900-01-04' AS DATETIME) AS my_date UNION
    SELECT CAST('1900-01-05' AS DATETIME) AS my_date UNION
    SELECT CAST('1900-01-06' AS DATETIME) AS my_date UNION
    SELECT CAST('1900-01-07' AS DATETIME) AS my_date
    ) AS My_Dates
WHERE
    DATENAME(dw, my_date) = @date_name

어디에 DayID 정수 값 1 ~ 7입니다.

1899-12-31과 같은 일부 기본 날짜에 DayId를 추가하십시오. (일요일이 첫 번째 요일이면 1899-12-30의 초기 날짜를 사용하십시오)

1900-01-01은 1900-01-02 년 월요일 화요일이었습니다.

따라서 :

select DayID, 
       datename( weekday, dateadd( day, DayID, '18991231' ) ) 

SQL 2014에서는 다음을 사용할 수 있습니다.

datePart (dw, getDate ())를 선택하십시오. 이것은 요일을 정수로 돌아갑니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top