web-dev-qa-db-ja.com

SQL ServerのDateTimeデータ型からDateのみを返す方法

SELECT GETDATE()

戻り値:2008-09-22 15:24:13.790

私はその日付部分が時間部分なしで欲しいのです:2008-09-22 00:00:00.000

どうやって入手できますか?

1544
eddiegroves

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について考える必要はありません
2234
aku

SQLServer 2008には、日付コンポーネントのみが含まれる「date」データ型があります。 SQLServer 2008以降を使用している人は誰でも次のことができます。

SELECT CONVERT(date, GETDATE())
679
BenR

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

select cast(getdate() as date)
154
abatishchev

DATEADDとDATEDIFFは、varcharへの変換よりも優れています。両方のクエリは同じ実行計画を持っていますが、実行計画は主に data アクセス戦略であり、すべての部分を実行するのにかかるCPU時間に含まれる暗黙的なコストを必ずしも明らかにしません。両方のクエリが何百万もの行を含むテーブルに対して実行される場合、DateDiffを使用したCPU時間はConvert CPU時間の3分の1近くになる可能性があります。

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

set showplan_text on
GO 

DATEADDとDATEDIFFの両方がCONVERT_IMPLICITを実行します。

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


DatesTableからのSELECT CONVERT(varchar、MyDate、101)

  |--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に変換するよりもかなり速いことを証明します。

70
Ricardo C

これを試して:

SELECT CONVERT(VARCHAR(10),GETDATE(),111)

上記のステートメントはあなたの現在のフォーマットをYYYY/MM/DDに変換します、あなたの望ましいフォーマットを選ぶために このリンク を参照してください。

41
Nescio
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
37
Cade Roux

日付だけを返すためにCONVERT関数を使うことができます。下記のリンクを参照してください。

SQL Server 2000における日付と時刻の操作

キャストと変換

Convert関数を使用するための構文は次のとおりです。 

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 
19
DaveK

日付形式で返す場合  

CAST(受注日AS日付)

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

12/12/2013のように戻ります

SQL Server 2012の場合、以下のコードを使用します

CONVERT(VARCHAR(10), OrderDate , 111)
17
Mahesh ML

FLOOR()を使用して - ちょうど時間の一部をカット。

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
13
DiGi
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
12
Rushda

CONVERTを使用して、提示された元の質問と同じ出力、つまりyyyy-mm-ddを取得する場合は、前のカップルと同じCONVERT(varchar(10),[SourceDate as dateTime],121)と同じコードを使用しますが、ダッシュ付きのyyyy-mm-ddに変換するコード121です。

ちょっと私のsoapboxに乗ることができるならば、 この種のフォーマットはデータ層 に属していません、そしてそれはそれが愚かに高いオーバーヘッド 'トリック'なしでは不可能だった理由です実際のdatepartデータ型が導入されたSQL Server 2008まで。データ層でこのような変換を行うことはDBMSのオーバーヘッドの大きな浪費ですが、さらに重要なことは、このようなことを2回目に行った場合、基本的にはインメモリの孤立データを作成したことです。別の3NF +列に戻したり、元に戻すことなく入力したものと比較したりすることはできません。したがって、これまでの作業で失敗した点が発生し、リレーショナル参照が削除されます。 

必ず先に進み、dateTimeデータ型を呼び出し側プログラムに戻して、 PRESENTATION層に戻して、必要な調整を行ってください。 呼び出し元に返す前に変換を始めるとすぐに、アプリケーションから参照整合性の期待をすべて取り除いていることになります。これはUPDATEまたはDELETE操作を防ぐためのものです。手動の復帰操作を何もしない限り、これも必要ありません。データをhuman/code/gremlinエラーにさらすことになります。

11
Focusyn

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

Format() functionを使用してください。

SQL Serverにはすでに複数の回答とフォーマットの種類があります。 しかし、ほとんどの方法は多少あいまいであり、特定の日付フォーマットに関してフォーマットタイプや関数の番号を覚えるのは難しいでしょう。そのため、SQL Serverの次期バージョンではより良い選択肢があります。

FORMAT ( value, format [, 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. カスタムの日付と時刻のフォーマット文字列
10
Somnath Muluk
SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)

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

SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))

編集:最初の2つの方法は基本的に同じで、out to varcharメソッドを実行します。

10
Gordon Bell

示された結果を得るために、私は以下のコマンドを使います。

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

私はそれが便利だと思います。

9
Anderson Silva

Varcharデータ型の結果が必要な場合は、通過する必要があります。

SELECT CONVERT(DATE, GETDATE()) --2014-03-26
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26

これはすでに上で言及されています 

日付と時刻の形式で結果が必要な場合は、以下のクエリのいずれかを通過する必要があります。

1)OnlyDateとしてのSELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 111)) - 2014-03-26 00:00:00.000

2)OnlyDateとしてのSELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 112)) - 2014-03-26 00:00:00.000

3)

 DECLARE  @OnlyDate DATETIME
   SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
   SELECT @OnlyDate AS OnlyDate

--2014-03-26 00:00:00.000

9
Stephon Johns
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

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

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

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03
7
Art Schmidt

さて、私は少し遅れていますが:)、これはもう一つの解決策です。

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')
6
Krishnraj Rana

私はこれがあなたの場合にはうまくいくと思います:

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

古代の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
5
Matt O'Brien
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)
5
etni

SQL SERVER 2012以降、これを実行できます。

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

4
xbb

私は言及されていない次のことを支持します。

DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))

それぞれの 'datepart'はおそらく数学を行いますが、それはまた、ローカルを気にしたり二重変換をしたりしません。それで、それはdatediff方法より少し遅いかもしれません、しかし私にとってそれははるかに明確です。特に年と月だけでグループ化したい場合(1に日を設定します)。

4
Gerard ONeill

SQL Server 2000の場合

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)
4
kaub0st3r

日付:

 SELECT CONVERT(日付、GETDATE())
 SELECT CAST(日付としてGETDATE())

時間:

 SELECT CONVERT(時間、GETDATE()、114)
 SELECT CAST(時間としてGETDATE())
4
Kris Khairallah

単にこうすることができます。

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

または単にこのようにします。

SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'

結果:

Date Part Only
--------------
2013-07-14
3
Amar Srivastava

なぜDATE_FORMAT(your_datetiem_column、 '%d-%m-%Y')を使わないのですか?

例:select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name

'%d-%m-%Y' partを並べ替えることで、m、d、yearの順番を変えることができます。

3

これはすべての答えに欠けていた、最も効率的ではないが書くことおよび理解することが非常に簡単である必要はなく、スタイルも複雑でも、複雑な日付関数もない。

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

日付(日付と時刻のフィールド) および DATE_FORMAT(日付と時刻、 '%Y-%m-%d') 両方の戻り値 日付のみ 日付と時刻から 

2
Surekha
SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'
2
Binitta Mary

日付部分と日付のフォーマットには、次のものを使用できます。

DATENAME =>指定された日付の指定された日付部分を表す文字ストリングを返します

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

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

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

2
user1151326

私はこれが古いことを知っています、しかし私は誰もがこのようにそれを述べたところで見ません。私が言えることから、これはANSI規格です。

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

マイクロソフトがANSI標準のCURRENT_DATE変数もサポートできればそれは良いでしょう。

2
lit

SQL 2008以降を使用している場合:SELECT CONVERT(DATE ,GETDATE())

1
Morteza Sefidi

これを試して:

SELECT CONVERT(date, GETDATE()) as date
1
Rafiqul Islam

時間を使わずに日付を取得するための私の共通のアプローチ 

 SELECT CONVERT(VARCHAR(MAX),GETDATE(),103)

 SELECT CAST(GETDATE() AS DATE)
1
Spider

日付に2008-09-22 00:00:00.000を表示する場合

それからあなたはそれを使ってそれを丸めることができます

SELECT CONVERT(datetime, (ROUND(convert(float, getdate()-.5),0)))

これにより、質問の形式で日付が表示されます

1
ChrisM

cONVERT(datetime、CONVERT(date、getdate()))te)としてconvert(getdate()を選択します。)

0
mokh223

あなたは日付だけのための異なったタイプの出力のために下記のように使うことができます

  1. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 103)) ----- dd/mm/yyyy

  2. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))------ mm/dd/yyyy

  3. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 102))

0
ankit soni
select cast(createddate as date) as derivedate from table 

createdateはあなたのdatetimeカラムです。これはsqlserverで動作します。

0
karthik kasubha

SELECT CONVERT(date、getdate())

0
Shiraj Momin

以下のコードを使用すると、日付部分のみを取得し、SQL部分の時間部分を避けることができます。

SELECT SYSDATE TODAY FROM DUAL; 
0
Shyam Bhimani

最も簡単な方法は次のものを使うことです。SELECT DATE(GETDATE())

0
Jithin Joy

うわー、あなたがこれを行うことができる方法を数えてみましょう。 (駄目なし)

あなたが具体的にこのフォーマットで欲しい結果を得るために:

2008-09-22

ここにいくつかの選択肢があります。

SELECT CAST(GETDATE() AS DATE) AS 'Date1'
SELECT Date2  = CONVERT(DATE, GETDATE())
SELECT CONVERT(DATE, GETDATE()) AS 'Date3'
SELECT CONVERT(CHAR(10), GETDATE(), 121) AS 'Date4'
SELECT CONVERT(CHAR(10), GETDATE(), 126) AS 'Date5'
SELECT CONVERT(CHAR(10), GETDATE(), 127) AS 'Date6'

それで、私はあなたが快適であるものを選び、あなたのすべてのテーブルの板の向こう側にその方法を使うことを勧めます。

これらのオプションはすべて、まったく同じ形式で日付を返します。 SQL Serverになぜそのような冗長性があるのですか?

私にはわかりませんが、彼らにはわかります。たぶん私より賢い人がその質問に答えることができます。

これが誰かに役立つことを願っています。

0
Aubrey Love

私のスタイル

      select Convert(smalldatetime,Convert(int,Convert(float,getdate())))
0
CAGDAS AYDIN