この記事では、最も一般的なTransact-SQL日付関数の1つであるDATEADD、DATEDIFF、およびDATEPARTの使用方法の基本的な理解を深めることに焦点を当てています。
この記事では、毎日の日付操作でこれらの日付関数を適切に使用することの重要性を強調し、その後、これらの日付関数を共同で使用して、わずかに複雑な日付計算を解決できるいくつかの興味深いシナリオを示しました。
これらの関数は主に日付操作で使用されるため、最初に日付操作の意味を理解してみましょう。
日付操作について
多くの場合、日時の値は要件に応じて変更する必要があり、日時の計算を変更、処理、または制御する方法は、日付操作と呼ばれます。
また、日付値がデータベースから読み取られ、再度保存される前に変更される場合のこの状況(日付操作)も参照します。
顧客注文シナリオ
日付操作の興味深い例は、顧客注文です。 シナリオ、注文 顧客によって配置された 処理され、配信日 注文日の5日前に設定する必要があります 、つまり、開発者はT-SQL日付関数を使用して注文日を操作(変更)する必要があります 納期を計算する 。
サンプルの日次売上レポート
少し複雑な例は、ビジネスユーザーが日次売上レポートを実行する場合です。 昨日の結果が表示されている場合。
たとえば、日次売上レポートを実行する場合 日曜日の11:00に、土曜日に基づいた結果が表示されます。土曜日の17:00に実行すると、当日がまだ終わっていないため、金曜日にすべての結果が表示されます。利用可能な完全な日は昨日です。これは、財務報告を含むほとんどの専門的な日報が実行されるように設計されている方法です。
この例では、現在の日付 は、1日の売上記録を含む前の日付を取得するように操作(変更)されます。
例の実装
この記事で説明されている最も一般的な日付関数のいくつかを使用することを十分に理解したら、これらのシナリオを実装するので、上記の例を覚えておいてください。
日付関数について
最初に、2つの日付(注文日と配達日)の間の日数の決定、現在の日付に基づく先週の販売記録の取得、またはに基づいた予想有効期限の計算など、日付操作の要件を満たすのに役立ついくつかの基本的な日付関数を見てみましょう。製造日など。
厳格なルールがないため、最初にDATEPART関数の調査を開始します。
DATEPART関数の使用
簡単な定義
DATEPART関数は、指定された日付の一部を数値で返すために使用されます。
パーツは、日付の日、日付の月、日付の年などにすることができます。
たとえば、DATEPART関数を使用して特定の日付の日を取得し、注文が日曜日に行われたかどうかを判断できます。
もう1つの例は、特定の日付の月を別の日付関数に渡してさらに処理することです。
Microsoftの定義
この関数は、指定された datepartを表す整数を返します。 指定された日付の 。
互換性
Microsoftのドキュメントによると、この関数は次のSQLServerバージョンと互換性があります。
- SQLServer2008プラス
- AzureSQLデータベース
- AzureSQLデータウェアハウス
- 並列データウェアハウス
構文
DATEPART (datepart , date)
例1:日付の年の部分を取得する
特定の日付( OrderDate )も定義しましょう )DATEPART関数を使用して目的の部分(日、月、年)を取得します。
注文日の年を取得するには、 YEARを渡すだけです。 続いて注文日(@OrderDate) DATEPART 次のように機能します:
-- Define Order Date DECLARE @OrderDate DATETIME2='2017-01-11' -- Getting Year of the Order Date SELECT DATEPART(YEAR,@OrderDate) as Year_OrderDate
例2:月のパートを取得する
日付の月を知りたい場合は、月 DATEPARTに渡す必要があります 次のように機能します:
-- Define Order Date DECLARE @OrderDate DATETIME2='2017-01-11' -- Getting Month of the Order Date SELECT DATEPART(MONTH,@OrderDate) as Month_OrderDate
例3:日のパートを取得する
日付の日の部分を見つけるには、日を渡すだけです。 DATEPARTに 次のように機能します:
-- Define Order Date DECLARE @OrderDate DATETIME2='2017-01-11' -- Getting Day of the Order Date SELECT DATEPART(DAY,@OrderDate) as Day_OrderDate
例4:平日のパートを取得する
日付の平日部分を取得するには、 WEEKDAYを渡すだけです。 DATEPARTに 次のように機能します:
-- Define Order Date DECLARE @OrderDate DATETIME2='2017-01-11' -- Getting Week Day of the Order Date SELECT DATEPART(WEEKDAY,@OrderDate) as WeekDay_OrderDate
日曜日の1から始まる水曜日の4を取得しています。
同様に、日付の四半期、時間、分、秒の部分も取得できます。
次の日付機能に移りましょう。
DATEADD関数の使用
簡単な定義
DATEADD関数は、日付を加算または減算するために使用されます。
たとえば、4日後または4日前の日付を確認できます。
これは、メンバーシップの有効期限が登録日から正確に1年である必要があるなど、特定の日付に基づいて予想日を計算する必要があるシナリオで非常に便利です。
もう1つの例は、コースの終了日を計算することです。これは、コースの開始日から正確に2か月後でなければなりません。
Microsoftの定義
この関数は、指定された数値を追加します 指定されたdatepartに対する値(符号付き整数として) 入力の日付 値を入力し、その変更された値を返します。
互換性
Microsoftのドキュメントによると、この関数は次のSQLServerバージョンと互換性があります。
- SQLServer2008プラス
- AzureSQLデータベース
- AzureSQLデータウェアハウス
- 並列データウェアハウス
構文
DATEADD (datepart, number, date)
Datepartは、日、月、年、平日、時間などの日付の任意の部分です。
数値は、加算または減算する日付部分(日、月、年など)の番号です
日付は、DATEADD関数を使用して加算または減算する必要がある特定の日付です
例1:来年の日付を取得する
DATEADD を使用して加算または減算される特定の日付(登録日)も定義しましょう。 要件に基づいて機能します。
翌年の日付は、年の日付部分に1を追加することで取得できます。
登録日から翌年を取得するには、DatePart Yearを追加するだけです。 1、1、登録日(@RegistrationDate) DATEADD 次のように機能します:
-- Define Registration Date DECLARE @RegDate DATETIME2='2018-07-10' -- Getting Next Year from registratoin date SELECT DATEADD(YEAR,1,@RegDate) as NextYear_RegDate
例2:翌月の日付を取得する
翌月の日付を取得するには、月を渡します DATEADDの日付部分 関数の後に追加する月数が続き、その後に指定された日付(この場合は登録日(RegDate))が続きます。
-- Define Registration Date DECLARE @RegDate DATETIME2='2018-07-10' SELECT @RegDate AS RegDate -- Show Registration Date -- Getting Next MONTH from the registratoin date SELECT DATEADD(MONTH,1,@RegDate) as NextMonth_RegDate
例3:翌日の日付を取得する
登録の翌日(翌日)にコースを開始する場合は、日を通過する必要があります 1 翌日は登録日に別の日が追加されるため、次のように示されます。
-- Define Registration Date DECLARE @RegDate DATETIME2='2018-07-10' SELECT @RegDate AS RegDate -- Show Registration Date -- Getting Next DAY from registratoin date SELECT DATEADD(DAY,1,@RegDate) as NextDAY_RegDate
例4:日次売上レポートの日付を設定する
それでは、日次財務報告の作成でよく使用される少し複雑なシナリオに焦点を当てましょう。
毎日の売上レポートを作成する場合は、この記事の冒頭で説明したように、当日はまだ完了しておらず、最新の完了日は昨日であるため、昨日のデータを表示する必要があります。
最後に、レポートが1日をカバーしやすくするために、昨日の日時を日付のみの値に変換する必要もあります。
今日の日付に基づいて昨日の日付を取得するには、次のように現在の日付に「-1日」を追加する必要があります。
-- Define Current Date DECLARE @CurrentDate DATETIME2=GETDATE() SELECT @CurrentDate AS CurrentDate -- Show Registration Date -- Getting Yesterday Date and Time from current date SELECT DATEADD(DAY,-1,@CurrentDate) as YesterdayDateTime_CurrentDate -- Converting Yesterday DateTime into Date only SELECT CAST(DATEADD(DAY,-1,@CurrentDate) AS DATE)as YesterdayDateOnly_CurrentDate
DATEDIFF関数の使用
簡単な定義
DATEDIFF関数は、2つの日付間の日、月、年、時間などの違いを判別するために使用されます。
たとえば、2つの日付の間に何日が経過したかを知ることができます。
これは、注文の配達予定日と実際の注文の配達日の違いを調査する必要があるシナリオでも非常に便利です。
もう1つの例は、時間追跡です。これは、特定のプロジェクトが開始されてから現在までに何時間費やされたかを理解することを意味します。
Microsoftの定義
この関数は、指定された startdate 間で交差した、指定された日付部分の境界のカウントを(符号付き整数値として)返します。 およびenddate 。
互換性
Microsoftのドキュメントによると、この関数は次のSQLServerバージョンと互換性があります。
- SQLServer2008プラス
- AzureSQLデータベース
- AzureSQLデータウェアハウス
- 並列データウェアハウス
構文
DATEDIFF ( datepart , startdate , enddate )
Datepartは、日、月、年、平日、時間などの日付の任意の部分です。
例1:日数の違いを理解する
DATEDIFFがどのようになっているのかを理解してみましょう 機能は動作します。
2018年7月1日と2018年7月2日の間の日数の差を調べようとすると、1日が得られます。つまり、開始日から終了日を差し引いて差が得られます。
SELECT DATEDIFF(DAY,'01 JULY 2018','02 JULY 2018') AS Days_Between_Two_Consecutive_Dates SELECT DATEDIFF(DAY,'01 JULY 2018','03 JULY 2018') AS Days_Between_01_July_03_July
例2:注文から配達までの日数を取得する
注文日という2つの異なる日付を定義しましょう および納期 これは、日、月、年、時間などの違いを判断するために使用されます。
注文日から配達日までの日数を確認するために、DAY日付部分が DATEDIFFに渡されます。 関数の後に開始日(OrderDate)が続きます および終了日(配信日) :
-- Define Order Date and Order Delivery Date DECLARE @OrderDate DATETIME2='28 July 2018' DECLARE @DeliveryDate DATETIME2='07 August 2018' SELECT @OrderDate AS OrderDate,@DeliveryDate as DeliveryDate-- Show Order and Delivery Dates -- Getting difference in days between order date and delivery date SELECT DATEDIFF(DAY,@OrderDate,@DeliveryDate) as Days_Between_Order_and_Delivery
例3:プロジェクト時間の取得(タイムトラッキング)
これは、DATEDIFF関数を使用したタイムトラッキングの興味深い例です。
たとえば、特定のプロジェクトに費やした合計日数、時間数、日数、分数を知りたい場合は、最初にDAY日付部分をDATEDIFF関数に渡します。ここで開始日はプロジェクトが開始された日付であり、終了日は今日の日付であり、その後に次のようにHOURを渡し、次にMINUTEを渡します。
-- Define Project Start Date DECLARE @ProjectStartDate DATETIME2='10 Nov 2018' SELECT @ProjectStartDate AS ProjectStartDate-- Show Project Start Date -- Getting Number of days spent on the project so far SELECT DATEDIFF(DAY,@ProjectStartDate,GETDATE()) as Project_Days_So_Far -- Getting Number of hours spent on the project so far SELECT DATEDIFF(HOUR,@ProjectStartDate,GETDATE()) as Project_Hours_So_Far -- Getting Number of minutes spent on the project so far SELECT DATEDIFF(MINUTE,@ProjectStartDate,GETDATE()) as Project_Minutes_So_Far
おめでとうございます。DATEADD、DATEDIFF、およびDATEPARTT-SQL関数の使用方法を正常に学習しました。
やるべきこと
基本的な日付関数に慣れてきたので、以下のことを試してみてください。
- 以前の記事「単体テストレポートの手順– TDDD Part-4の開始にジャンプしてサンプルSQLDevBlogReportTDDデータベースを設定し、作成者の登録日に基づいて月数を確認するビューを作成する」を参照してください。
- 以前の記事「単体テストの簡略化メインストアドプロシージャ」を参照してください。これは、ユーティリティプロシージャも呼び出して、サンプルのSQLBookShopデータベースを作成し、 DeliveryDateを追加します。 BookOrderへの列 テーブルを作成し、新しいストアドプロシージャを作成します ProcessOrder DATEADDを使用します 注文日から5日後に配達予定を追加する機能。
- 前回の記事「テスト駆動データベース開発(TDDD)の開始にジャンプ–パート3」をご覧ください。サンプルのSQLDevBlogReportTDDデータベースのデータを変更して、DATEADDT-SQL関数を使用して日次レポートを作成してみてください。レポートに表示するのに十分なデータがあります。