日付比較 - sqlserver 日付 取得



SQL Server DateTimeデータ型から日付のみを返す方法 (20)

SQL Server 2012以降のバージョンを使用している場合は、

Format()関数を使用します。

SQL Serverには複数の回答と書式設定の種類があります。 しかし、ほとんどの方法はやや曖昧で、特定の日付形式に関する形式の種類や機能の数を覚えておくことは難しいでしょう。 そのため、SQL Serverの次のバージョンでは、より良いオプションがあります。

FORMAT ( value, format [, culture ] )

あなたの視聴者ごとに日付を指定できるので、Cultureオプションは非常に便利です。

d(小さなパターンの場合)とD(長いパターンの場合)を覚えておく必要があります。

1. "d" - 短い日付パターン。

2009-06-15T13:45:30 -> 6/15/2009 (en-US)
2009-06-15T13:45:30 -> 15/06/2009 (fr-FR)
2009-06-15T13:45:30 -> 2009/06/15 (ja-JP)

2. "D" - 長い日付パターン。

2009-06-15T13:45:30 -> Monday, June 15, 2009 (en-US)
2009-06-15T13:45:30 -> 15 июня 2009 г. (ru-RU)
2009-06-15T13:45:30 -> Montag, 15. Juni 2009 (de-DE)

クエリの例

DECLARE @d DATETIME = '10/01/2011';
SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result'; 

SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result';

US English Result Great Britain English Result  German Result Simplified Chinese (PRC) Result
----------------  ----------------------------- ------------- -------------------------------------
10/1/2011         01/10/2011                    01.10.2011    2011/10/1

US English Result            Great Britain English Result  German Result                    Chinese (Simplified PRC) Result
---------------------------- ----------------------------- -----------------------------  ---------------------------------------
Saturday, October 01, 2011   01 October 2011               Samstag, 1. Oktober 2011        2011年10月1日

より多くのフォーマットが必要な場合は、次のページにアクセスできます。

  1. 標準の日付と時刻の書式文字列
  2. カスタム日付と時刻のフォーマット文字列
SELECT GETDATE()

返品: 2008-09-22 15:24:13.790

私は時間の部分を除いてその日付の部分をしたい: 2008-09-22 00:00:00.000

どうすれば入手できますか?


Answer #1

DATEADDとDATEDIFFは、CONVERTing to varcharよりも優れています。 両方のクエリには同じ実行計画がありますが、実行計画は主にデータアクセス戦略に関するものであり、すべての部分を実行するために必要なCPU時間に伴う暗黙のコストを必ずしも明らかにするわけではありません。 両方のクエリが数百万行のテーブルに対して実行される場合、DateDiffを使用するCPU時間は、Convert CPU時間の1/3に近くなる可能性があります。

クエリの実行計画を確認するには:

set showplan_text on
GO 

DATEADDとDATEDIFFはどちらもCONVERT_IMPLICITを実行します。

CONVERTソリューションは、シンプルで読み易いものもありますが、遅くなります。 datetimeにキャストする必要はありません(これはサーバーによって暗黙的に行われます)。 また、DateDiffメソッドのDateAddの後には、整数結果も暗黙的にdatetimeに変換されるため、実際の必要はありません。

SELECT CONVERT(varchar、MyDate、101)FROM DatesTable

  |--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

SELECT DATEADD(dd、0、DATEDIFF(dd、0、MyDate))FROM DatesTable

  |--Compute Scalar(DEFINE:([Expr1004]=dateadd(day,(0),CONVERT_IMPLICIT(datetime,datediff(day,'1900-01-01 00:00:00.000',CONVERT_IMPLICIT(datetime,[TEST].[dbo].[DatesTable].[MyDate],0)),0))))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

@digiとしてFLOOR()を使用すると、DateDiffに近いパフォーマンスが得られますが、datetimeデータ型をfloatにキャストして元の値を返すとは限りません。

みんなを覚えている:誰も信じてはいけない。 パフォーマンス統計を見て、自分でテストしてください!

結果をテストするときは注意してください。 クライアントに多くの行を選択すると、計算を実行するよりもネットワークを介して行を送信するのに時間がかかるため、パフォーマンスの差異が隠されます。 したがって、すべての行の作業はサーバーによって行われますが、クライアントに送信される行セットは存在しないことを確認してください。

キャッシュの最適化がクエリに及ぼす影響については、一部の人にとって混乱が生じるようです。 同じバッチまたは別々のバッチで2つのクエリを実行しても、キャッシュには影響しません。 したがって、手動でキャッシュを期限切れにするか、クエリを前後に複数回実行することができます。 クエリ#2の最適化は後続のクエリにも影響しますので、必要に応じて実行#1をスローしてください。

ここでは、DateDiffがvarcharに変換するよりも大幅に高速であることを証明する完全なテストスクリプトとパフォーマンス結果があります。


Answer #2

FLOOR()を使用する - ちょうど時間の部分をカット。

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)

Answer #3

SQL 2008以上を使用している場合:

select cast(getdate() as date)

Answer #4

SQL Server 2012以降、これを行うことができます。

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')


Answer #5

SQLServer 2008には、時刻コンポーネントを持たない日付のみを含む '日付'データ型が作成されました。 SQLServer 2008以降を使用すると、次のことができます。

SELECT CONVERT(date, GETDATE())


Answer #7

SQL Server 2008以降では、以下のようにCONVERTを実行してください。

SELECT CONVERT(date, getdate())

古いバージョンでは、次のことができます。

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))

例えば

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

私に与える

2008-09-22 00:00:00.000

長所:

  • varchar < - > datetime変換は必要ありません
  • localeについて考える必要はありません

Answer #8

返品日付形式

CAST(AS日付のOrderDate)

上記のコードはSQL Server 2010で動作します

2013年12月12日のように戻る

SQL Server 2012の場合、以下のコードを使用してください

CONVERT(VARCHAR(10), OrderDate , 111)

Answer #9

これはすべての回答に欠けていたが、最も効率的ではないが、書いて理解しやすく、スタイルを必要とせず、複雑な日付機能もない。

SELECT CONVERT(DATETIME,CONVERT(DATE,((GETDATE()))))

Answer #10

さて、私は少し遅れています:)、ここに別の解決策があります。

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME)

結果

2008-09-22 00:00:00.000

SQL Server 2012以降を使用している場合は、このようなFORMAT()関数を使用できます。

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')

Answer #11

もしあなたがCONVERTを使い、元の質問と同じ出力を得たいなら、それはyyyy-mm-ddで、前のカップルの答えと同じコードをCONVERT(varchar(10),[SourceDate as dateTime],121)しかし、ダッシュでyyyy-mm-ddに変換するコードは121です。

私の石鹸ボックスを一秒間入手できれば、 この種の書式設定はデータ層に属しません。そのため、実際の日付データ型がSQL Server 2008になるまで、奇妙な高オーバーヘッドの「トリック」なしでは不可能でした導入されました。 このような変換をデータ層で行うことは、DBMSのオーバーヘッドを大いに浪費しますが、もっと重要なのは、次のようなことです。基本的にはメモリ内の孤立したデータが作成されています。 それを別の3NF +列に戻すことも、元に戻すことなくタイプされたものと比較することもできません。したがって、失敗点が導入され、リレーショナル参照が削除されます。

あなたは常に先に進んで、あなたのdateTimeデータ型を呼び出し側のプログラムとプレゼンテーション層に戻す必要があります。 呼び出し元に返す前に変換するとすぐに、アプリケーションから参照整合性のすべての希望を取り除きます。 これにより、手動復帰を行わない限り、UPDATEまたはDELETE操作が再び防止されます。これは、不要な場合にデータをhuman / code / gremlinエラーにさらしていることを意味します。


Answer #12

古代のMSSQL Server 7.0を使用しても、ここのコード(このlink礼儀)は、私がその時に探していたどのような日付形式を取得することを可能にしました:

PRINT '1) Date/time in format MON DD YYYY HH:MI AM (OR PM): ' + CONVERT(CHAR(19),GETDATE())  
PRINT '2) Date/time in format MM-DD-YY: ' + CONVERT(CHAR(8),GETDATE(),10)  
PRINT '3) Date/time in format MM-DD-YYYY: ' + CONVERT(CHAR(10),GETDATE(),110) 
PRINT '4) Date/time in format DD MON YYYY: ' + CONVERT(CHAR(11),GETDATE(),106)
PRINT '5) Date/time in format DD MON YY: ' + CONVERT(CHAR(9),GETDATE(),6) 
PRINT '6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): ' + CONVERT(CHAR(24),GETDATE(),113)

それはこの出力を生成した:

1) Date/time in format MON DD YYYY HH:MI AM (OR PM): Feb 27 2015  1:14PM
2) Date/time in format MM-DD-YY: 02-27-15
3) Date/time in format MM-DD-YYYY: 02-27-2015
4) Date/time in format DD MON YYYY: 27 Feb 2015
5) Date/time in format DD MON YY: 27 Feb 15
6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): 27 Feb 2015 13:14:46:630

Answer #13

日付部分と日付の書式設定には、次のように使用できます。

DATENAME =>指定された日付の指定されたdatepartを表す文字列を返します。

DATEADD => DATEPART()関数は、年、月、日、時、分などの日付/時刻の単一の部分を返すために使用されます。

DATEPART =>指定した日付の指定されたdatepartを表す整数を返します。

CONVERT() => CONVERT()関数は、あるデータ型の式を別のデータ型に変換する一般的な関数です。 CONVERT()関数を使用すると、さまざまな形式の日付/時刻データを表示できます。


Answer #14

示された結果を得るために、私は次のコマンドを使用します。

SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))

私はそれが役に立ちます。


Answer #15

私はこれがあなたのケースでうまくいくと思います:

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25

Answer #16

結果を列または変数に割り当てる場合は、DATE型を指定し、変換は暗黙的に行われます。

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03

Answer #17
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014

Answer #18
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),103) --21/09/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),101) --09/21/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),111) --2011/09/21

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),107) --Sep 21, 2011

Answer #19
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))




datetime