変換の名前の日を整数で表現
-
23-08-2019 - |
質問
SQLサーバーで利用できますDATENAME機能の日の週間の文字列として
declare @date datetime
set @date = '12/16/08'
select datename(dw, @date)
に戻すための"火曜日"
とで利用できますDATEPART機能の曜日を整数として
declare @date datetime
set @date = '12/16/08'
select datepart(dw, @date)
を返します3
ものの言いvarcharが含まれる文字列"火"やりたいとしてその整数表現3.確かに、ただ単に"サムネやエンジンの変換なものを手がな利用内蔵機能です。このような機能がありますか?
解決
関数を記述するのではなく、あなたが説明し、数値で週テーブルの日数を作成する必要があります。その後、あなたは、単に数値を取得するには、テーブルに参加することができます。
そして、あなたは(characterbasedシステムではそう)複数の方法を保存日数を持っている場合は火、火、火曜日は全て同じ整数にマップしますので、あなたは、テーブルにすべてのバリエーションを置くことができます。
他のヒント
残念ながら、機能に組み込まれて存在していないですが、あなたはこのように独自に作成することができます
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-サーバ - タグ付きかどうかわかりません2014 のは、何かがこれを行うにはなります。
私はちょうどIF
ステートメントで行わ@RussBradberryに同様のアプローチを取っています。
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
ちょうどあなたの好みや変数の日と木曜日を置き換えます。
仕組み:(「木曜日」、1,3)は基本的に木を作成SUBSTRINGは、その後、CHARINDEXは3である私達の日の単語の長さによって、私たちは、その後、10分割10である文字列内の木の位置を見つけ出しました3に等しい、と私はしたいので、
月曜日は1に等しくなるように 火曜日2に等しくなるように 等しい水曜日3 木曜日4に等しくなるように
私は最後に1を追加します。
その結果は4である。
誰かに役立ちますが、私はそれはおそらく最良の解決策ではありません同意希望ます。
注:また、そのようにそれを使用して一日数によって、結果セットを注文することができます:
SELECT ID,DayNamesColumn from mytable ORDER BY CHARINDEX(SUBSTRING(DayNamesColumn ,1,3), 'MONTUEWEDTHUFRISATSUN') / 3 + 1
あなたは、週の最初の日を決定DATEFIRST @@の現在の設定(例えば関わらず)に対する日付2017-12-15
のISO曜日の順序を取得するには、次の選択を使用することができます。例えば。月曜日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')
私は、ルックアップテーブルを追加する方法についての答えに反対します。ルックアップテーブルは、単にコストが追加されます参加します。
私見。あなたが制限された値を持っているので、私はちょうど私の見解ではcase文を使用します。それはきれいではありませんが、それはおそらく、それを行うための最速の方法です。
これは実用的な目的を果たしていないかもしれないが、私はちょうど楽しみのためにそれを把握しようと思いました。 :)以下の作品ます。
DATEPARTを使用するか、DATENAMEときDATEFIRST @@の値が重要であり、あなたの結果を変えることができるということを覚えておいてください。オンラインヘルプのSET 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です。
追加DayIDを一部ベース日時など1899-12-31.(日曜日は初日の週間後に利用を開始した日1899-12-30)
1900-01-01た月曜日、1900-01-02日は火曜日です。
このように:
select DayID,
datename( weekday, dateadd( day, DayID, '18991231' ) )
SQL 2014で、使用することができます:
SELECT DATEPART(DW、のGetDate())これは、整数として、曜日を返します。