변환의 이름이 하루의 정수 표시
-
23-08-2019 - |
문제
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 버전이지만 여전히 내장 기능이 없습니다 (내가 아는 한). 확실하지 않습니다 SQL-Server-2014 이것을 할 것입니다.
나는 방금 @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 ())를 선택하십시오. 이것은 요일을 정수로 돌아갑니다.