1. ホーム
  2. データベース
  3. エムエスエル

SQLスキルのデータベースは、ケースを整理する

2022-01-05 21:38:39

I. 指定した月の日数を取得する

指定された日付をもとに、その月の日数を計算します。
システム変数@@DATEFIRSTの値をもとに、[DatePart(WEEKDAY,RQ) = (07-@DateFirst) % 7 + 1]として日曜日の序数を決定する。以下は、日曜日、月曜日...土曜日の計算式である。

<テーブル 計算式 週間 (7-@@DateFirst)%7 + 1 曜日 (7-@@DateFirst)%7 +2 月曜日 (7-@@DateFirst)%7 +3 火曜日 (7-@@DateFirst)%7 +4 水曜日 (7-@@DateFirst)%7 +5 木曜日 (7-@@DateFirst)%7 +6 金曜日 (7-@@DateFirst)%7 +7 土曜日

以下は、日曜日を取得するためのSQL文です。SQL文は、データを取得するためにネストされたループを使用しています。

DECLARE @Day SmallDateTime
SET @Day = DateAdd(MM, DateDiff(MM,0,'2019-11-21'), 0)

;WITH Temp AS
( SELECT @Day AS RQ UNION ALL
    SELECT RQ+1
    FROM TEMP WHERE DateDiff(Month,RQ+1,@Day) = 0
)
SELECT
    RN = Row_Number() Over(ORDER BY RQ),
    RQ
FROM Temp WHERE DatePart(WEEKDAY,RQ)= (07-@@@DateFirst) % 7 + 1

<スパン どこで

[DateAdd(MM, DateDiff(MM,0,'2019-08-21'), 0)] は、月の初日を取得するための通常の方法です。
実行結果は次のようになります。

+--+---------------------+

|--+---------------------|

| 1 | 2019-08-04 00:00:00 |

| 2 | 2019-08-11 00:00:00 |

| 3 | 2019-08-18 00:00:00 |

| 4 | 2019-08-25 00:00:00 |

+---+---------------------+

<スパン II. 指定した月の全日程の日付を取得する

どこで
[DateDiff(Month,fDay+1,@RQ) = 0]が月の等価性を判断する常套手段です

DECLARE @RQ SMALLDATETIME
SET @RQ = '2019-09-01';

;WITH
  tAppDays (fDay) AS
  (
    SELECT @RQ AS fDay
    UNION ALL
    SELECT fDay + 1 FROM tAppDays WHERE DateDiff(Month,fDay+1,@RQ) = 0
  )
SELECT * FROM tAppDays ORDER BY fDAY

以下は実行結果です。

fDay

---------------------

2019-09-01 00:00:00

2019-09-02 00:00:00

2019-09-03 00:00:00

...

2019-09-23 00:00:00

2019-09-24 00:00:00

2019-09-25 00:00:00

2019-09-26 00:00:00

2019-09-27 00:00:00

2019-09-28 00:00:00

2019-09-29 00:00:00

2019-09-30 00:00:00

<スパン III. 部分文字列の一覧の取得

再帰を使って、与えられた文字列のSPLITメソッドを取得する

-- SPLIT method that uses recursion to get a given string

DECLARE @CommentStr NVARCHAR(4000)='General Manager's Office|Sales Department|Accounting Department|Human Resources Department|Trade Union|Logistics Department|Production Planning Department|Power Branch|Quality Inspection Department|Transportation Department'
DECLARE @Split NVARCHAR(1)='|';

WITH Temp AS
( SELECT 1 AS Num UNION ALL
   SELECT Num + 1
   FROM TEMP WHERE Num<Len(@CommentStr) )
SELECT
  RN = Row_Number() Over(ORDER BY Num),
  SplitStr = SUBSTRING(@CommentStr,Num,CHARINDEX(@Split,@CommentStr+@Split,Num)-Num)
FROM Temp WHERE SUBSTRING(@Split+@CommentStr,Num,1) = @Split OPTION(MAXRECURSION 0);

その仕組みは次のとおりです。

<ブロッククオート

RN SplitStr

------------------------

 1 ゼネラルマネージャーオフィス

 2 営業部

 3 経理部

 4 人事部

 5 労働組合

 6 物流部

 7 生産企画部

 8 電力サブプラント

 9 品質検査部

10 運送部門

------------------------

区切り文字付きの文字列が与えられたら、このステートメントで個々のフィールドのリストを取得します。

-- ================================================================================================
-- pAppGetSplit '|','Subject name|ID number|student name|instructor number|instructor name|training times|total times|responsibility percentage'
================================================================================================
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'pAppGetSplit' AND type = 'P')
   DROP PROCEDURE pAppGetSplit
GO
CREATE PROCEDURE pAppGetSplit
  @Split VARCHAR(1),
  @STR NVARCHAR(4000)
AS
  WITH Temp AS -- Get a list of fields by separator
  ( SELECT 1 AS Num UNION ALL
     SELECT Num + 1
     FROM TEMP WHERE Num<Len(@STR) )
  SELECT
    RN = Row_Number() Over(ORDER BY Num),
    SplitStr = SUBSTRING(@STR,Num,CHARINDEX(@Split,@STR+@Split,Num)-Num)
  FROM Temp WHERE SUBSTRING(@Split+@STR,Num,1) = @Split OPTION(MAXRECURSION 0);
GO

その仕組みは次のとおりです。

<ブロッククオート

+---+---------------------+

|RN|SplitStr|(スプリットストリング

|----+---------------------|

| 1|セクション名

| 2|ID番号

| 3|学習者名

| 4|インストラクター番号

| 5|コーチの名前

| 6|トレーニングセッションの回数

| 7|総セッション数

| 8|責任者比率

+--+---------------------+

<スパン IV. 指定した曜日の日付を取得する

取得するために指定された曜日に基づいて日付を取得します。

--get the date of the Monday of the week
DECLARE @Z SMALLINT
-- [1,2,3,4,5,6,7] for [Mon,Tue,Wed,Thu,Fri,Sat,Sun] respectively
SET @Z=1
SELECT
  GetDate() Today,
  DATEPART(Weekday,GetDate()) Today's serial number,
  (DATEPART(Weekday,GetDate()) + @@DATEFIRST-1)%7 What day of the week it is,
  DATEADD(Day,@Z-(DATEPART(Weekday,GetDate()) + @@DATEFIRST-1)%7,GetDate()) Monday of the week

これは、データベースの仕上げの場合のSQLスキルに関するこの記事の終わりです、より関連するSQLスキルの内容は、スクリプトハウスの前の記事を検索してくださいまたは次の関連記事を閲覧し続けるあなたは、将来的にもっとスクリプトハウスをサポートすることを願っています!.