3

stred プロシージャで 2 つの datetime 間の Get Time Difference を取得したい。次に、その答えを varchar にキャストする必要があります。その値を取得する方法がわかりません。私はstroed手順の新しいものです。私はSQLサーバー2008を使用しています

declare @tdate1 datetime
declare @date2 datetime
declare @finaltime varchar

set @enddate = '2004-10-18 07:53:35.000'
set @startdate = '2004-10-18 15:28:57.000'

if @startdate >= @enddate
// This is what i want to do..

else
4

5 に答える 5

18
SELECT DATEDIFF(year, @startdate, @enddate)

これを試して、正しい方向に進んでください。

year返したい測定期間を表します

役立つ可能性のある MSDN 記事へのリンクを次に示します。

DATEDIFF(Transact-SQL)

他のバージョン

更新日: 2015 年 12 月 2 日

このトピックは以下に適用されます:

はいSQL Server (2008 以降) はいAzure SQL データベース はいAzure SQL データ ウェアハウス はいParallel Data Warehouse 指定された startdate と enddate の間で交差する指定された datepart 境界の数 (符号付き整数) を返します。大きな違いについては、「DATEDIFF_BIG (Transact-SQL)」を参照してください。Transact-SQL のすべての日付と時刻のデータ型と関数の概要については、「日付と時刻のデータ型と関数 (Transact-SQL)」を参照してください。トピック リンク アイコン Transact-SQL 構文規則 構文

DATEDIFF ( datepart , startdate , enddate )

-- Azure SQL データ ウェアハウスと並列データ ウェアハウス

DATEDIFF (datepart ,startdate ,enddate )

引数

日付部分

交差する境界のタイプを指定する startdate と enddate の一部です。次の表に、有効なすべての datepart 引数を示します。ユーザー定義の変数に相当するものは無効です。

日付部分

略語

year
yy, yyyy
quarter
qq, q
month
mm, m
dayofyear
dy, y
day
dd, d
week
wk, ww
hour
hh
minute
mi, n
second
ss, s
millisecond
ms
microsecond
mcs
nanosecond
ns
startdate

time, date, smalldatetime, datetime, datetime2または datetimeoffset 値に解決できる式です。date は、式、列式、ユーザー定義変数、または文字列リテラルにすることができます。startdate は enddate から減算されます。

あいまいさを避けるために、4 桁の年を使用してください。2 桁の年の詳細については、2 桁の年カットオフ サーバー構成オプションの構成を参照してください。終了日

startdateを参照してください。 戻り値の型 int 戻り値 各日付部分とその省略形は同じ値を返します。戻り値が int の範囲外 (-2,147,483,648 ~ +2,147,483,647) の場合、エラーが返されます。ミリ秒の場合、開始日と終了日の最大差は 24 日 20 時間 31 分 23.647 秒です。第二に、最大の差は 68 年です。startdate と enddate の両方に時刻の値のみが割り当てられ、datepart が時刻の datepart でない場合は、0 が返されます。startdate または endate のタイム ゾーン オフセット コンポーネントは、戻り値の計算には使用されません。smalldatetime は分までしか正確ではないため、startdate または enddate に smalldatetime 値を使用すると、戻り値で秒とミリ秒が常に 0 に設定されます。日付データ型の変数に時間値のみが割り当てられている場合、欠落している日付部分の値は、デフォルト値の 1900-01-01 に設定されます。時刻または日付データ型の変数に日付値のみが割り当てられている場合、欠落している時刻部分の値はデフォルト値の 00:00:00 に設定されます。startdate または enddate のいずれかが時刻部分のみで、もう一方が日付部分のみの場合、欠落している時刻部分と日付部分はデフォルト値に設定されます。startdate と enddate の日付データ型が異なり、一方の時刻部分または小数秒の精度が他方よりも多い場合、他方の欠落部分は 0 に設定されます。これらの日付は隣接しており、時刻が 0.0000001 秒異なります。各ステートメントの startdate と endate の差は、datepart の 1 つのカレンダーまたは時間の境界を超えています。各ステートメントは 1 を返します。

SELECT DATEDIFF(year, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(quarter, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(month, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(dayofyear, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(day, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(week, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(hour, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(minute, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(second, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(millisecond, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');

備考 DATEDIFF は、選択リスト、WHERE、HAVING、GROUP BY、および ORDER BY 句で使用できます。DATEDIFF は、暗黙的に文字列リテラルを datetime2 型としてキャストします。これは、日付が文字列として渡される場合、DATEDIFF は形式 YDM をサポートしないことを意味します。YDM 形式を使用するには、文字列を明示的に datetime または smalldatetime 型にキャストする必要があります。SET DATEFIRST を指定しても、DATEDIFF には影響しません。DATEDIFF は、関数が決定論的であることを保証するために、常に日曜日を週の最初の曜日として使用します。例 次の例では、さまざまなタイプの式を startdate および enddate パラメータの引数として使用しています。A. startdate と enddate の列を指定する 次の例では、表の 2 つの列の日付が交差する日の境界の数を計算します。

CREATE TABLE dbo.Duration
    (
    startDate datetime2
    ,endDate datetime2
    );
INSERT INTO dbo.Duration(startDate,endDate)
    VALUES('2007-05-06 12:10:09','2007-05-07 12:10:09');
SELECT DATEDIFF(day,startDate,endDate) AS 'Duration'
FROM dbo.Duration;

-- 戻り値: 1 B. startdate と enddate にユーザー定義変数を指定する 次の例では、ユーザー定義変数を startdate と enddate の引数として使用しています。

DECLARE @startdate datetime2 = '2007-05-05 12:10:09.3312722';
DECLARE @enddate datetime2 = '2007-05-04 12:10:09.3312722'; 
SELECT DATEDIFF(day, @startdate, @enddate);

C. startdate と enddate にスカラー システム関数を指定する 次の例では、startdate と enddate の引数としてスカラー システム関数を使用しています。

SELECT DATEDIFF(millisecond, GETDATE(), SYSDATETIME());

D. startdate と enddate にスカラー サブクエリとスカラー関数を指定する 次の例では、startdate と enddate の引数としてスカラー サブクエリとスカラー関数を使用しています。AdventureWorks2012 を使用します。行く

SELECT DATEDIFF(day,(SELECT MIN(OrderDate) FROM Sales.SalesOrderHeader),
    (SELECT MAX(OrderDate) FROM Sales.SalesOrderHeader));

E. startdate と enddate の定数指定 次の例では、startdate と enddate の引数として文字定数を使用しています。

SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635'
    , '2007-05-08 09:53:01.0376635');

F. enddate の数値式とスカラー システム関数の指定 次の例では、数値式 (GETDATE ()+ 1) とスカラー システム関数の GETDATE および SYSDATETIME を enddate の引数として使用します。

USE AdventureWorks2012;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', GETDATE()+ 1) 
    AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO
USE AdventureWorks2012;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', DATEADD(day,1,SYSDATETIME())) AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO
G. Specifying ranking functions for startdate
The following example uses a ranking function as an argument for startdate.
USE AdventureWorks2012;
GO
SELECT p.FirstName, p.LastName
    ,DATEDIFF(day,ROW_NUMBER() OVER (ORDER BY 
        a.PostalCode),SYSDATETIME()) AS 'Row Number'
FROM Sales.SalesPerson s 
    INNER JOIN Person.Person p 
        ON s.BusinessEntityID = p.BusinessEntityID
    INNER JOIN Person.Address a 
        ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL 
    AND SalesYTD <> 0;

H. startdate の集計ウィンドウ関数の指定 次の例では、集計ウィンドウ関数を startdate の引数として使用しています。

USE AdventureWorks2012;
GO
SELECT soh.SalesOrderID, sod.ProductID, sod.OrderQty,soh.OrderDate
    ,DATEDIFF(day,MIN(soh.OrderDate) 
        OVER(PARTITION BY soh.SalesOrderID),SYSDATETIME() ) AS 'Total'
FROM Sales.SalesOrderDetail sod
    INNER JOIN Sales.SalesOrderHeader soh
        ON sod.SalesOrderID = soh.SalesOrderID
WHERE soh.SalesOrderID IN(43659,58918);
GO

例: Azure SQL Data Warehouse パブリック プレビューと Parallel Data Warehouse 次の例では、さまざまな種類の式を startdate パラメーターと enddate パラメーターの引数として使用しています。I. startdate と enddate の列の指定 次の例では、表の 2 つの列の日付が交差する日の境界の数を計算します。

CREATE TABLE dbo.Duration (
    startDate datetime2
    ,endDate datetime2
    );
INSERT INTO dbo.Duration(startDate,endDate)
    VALUES('2007-05-06 12:10:09','2007-05-07 12:10:09');
SELECT TOP(1) DATEDIFF(day,startDate,endDate) AS Duration
FROM dbo.Duration;

-- 戻り値: 1 J. startdate と enddate にスカラー サブクエリとスカラー関数を指定する 次の例では、startdate と enddate の引数としてスカラー サブクエリとスカラー関数を使用します。-- AdventureWorks を使用

SELECT TOP(1) DATEDIFF(day,(SELECT MIN(HireDate) FROM dbo.DimEmployee),
    (SELECT MAX(HireDate) FROM dbo.DimEmployee)) 
FROM dbo.DimEmployee;

K. startdate と enddate の定数の指定 次の例では、startdate と enddate の引数として文字定数を使用しています。

-- Uses AdventureWorks

SELECT TOP(1) DATEDIFF(day, '2007-05-07 09:53:01.0376635'
    , '2007-05-08 09:53:01.0376635') FROM DimCustomer;

L. startdate のランキング関数の指定 次の例では、startdate の引数としてランキング関数を使用しています。-- AdventureWorks を使用

SELECT FirstName, LastName
,DATEDIFF(day,ROW_NUMBER() OVER (ORDER BY 
        DepartmentName),SYSDATETIME()) AS RowNumber
FROM dbo.DimEmployee;

M. startdate の集計ウィンドウ関数の指定 次の例では、集計ウィンドウ関数を startdate の引数として使用しています。-- AdventureWorks を使用

SELECT FirstName, LastName, DepartmentName
    ,DATEDIFF(year,MAX(HireDate)
             OVER (PARTITION BY DepartmentName),SYSDATETIME()) AS SomeValue
FROM dbo.DimEmployee
于 2012-10-02T17:05:11.117 に答える
3

DATEDIFFをチェックアウトします。これを使用する方法のデモは次のとおりです。

SELECT DATEDIFF(day, [Start], [End]) AS [Days],
   DATEDIFF(minute, [Start], [End]) AS [Minutes],
   DATEDIFF(second, [Start], [End]) AS [Seconds] FROM Dates;
于 2012-10-02T17:04:23.947 に答える
1

2つの日付の日数の差を計算したい場合は、次のように提案します。

DECLARE @start DATETIME = '01-01-2000', 
      @end DATETIME = GETDATE() 

SELECT CAST(ABS(DATEDIFF(day, @end, @start)) AS VARCHAR(100)) 

私はあなたが常に肯定的な答えを望んでいると思いました、それでABSはあなたが日付の順序を無視することを可能にします。あなたはあなたの投稿でVarcharとして最終的な答えが欲しいと言ったので、私はキャストを含めました。

これがお役に立てば幸いです。

于 2012-10-03T09:19:15.957 に答える
1

DATEDIFF() を使用すると、秒の差、分の差、時間の差などを取得できます。しかし、明確な方法で日付/時刻の差を取得したい場合は、このようなことを行うことができます。.

declare @StartDate datetime, @EndDate datetime

select @StartDate = '04/07/2015 05:01:23.000',@EndDate='04/08/2015 10:32:30.000'

select convert(varchar(5),DateDiff(s, @startDate, @EndDate)/3600)+':'+convert(varchar(5),DateDiff(s, @startDate, @EndDate)%3600/60)+':'+convert(varchar(5),(DateDiff(s, @startDate, @EndDate)%60)) as [HH:MM:SS]

出力形式は [HH:MM:SS] になります: 05:31:07

これは、SQLで2つの日付時刻の時差を取得する最良の方法だと思います

于 2015-04-08T05:13:10.087 に答える
0

ここで私が以前に使用したもの、非常に短いコード:

CAST((@EndDateTime-@StartDateTime) を time(0)) として選択 '[hh:mm:ss]'

于 2014-09-03T16:34:08.700 に答える