1508

SELECT GETDATE()

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

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

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


  • 時間なしの日付データ型を取得しようとしている場合、たとえ時間が00:00:00であっても、あなたは運が悪くても、varcharを取得できますが、構造は日時であり、常にある程度の時間があります。 - Quintin Robinson
  • 注意すべき1つのことは、SQL Server 2008には、時間コンポーネントなしで日付だけを格納するための個別のDATEデータ型が含まれていることです。詳細はこちら:sql-server-performance.com/articles/dev/datetime_2008_p1.aspx - Ben Hoffstein
  • お見逃しなくこの郵便受け様々な時間除去方法の性能試験結果を示す。 - ErikE
  • 投票と承認された回答に誤解しないでください。見てくださいstackoverflow.com/a/126984/1155650 - Rohit Vipin Mathews
  • @Rohit 2008が唯一のバージョンであると誤って想定しているのですか。 (もっと多くのバージョンがあります。)投票は彼ら自身のために話します。 - hktegner

30 답변


2183

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


  • +1この方法は、一般的に使用されているdouble convert()メソッド(私も長年使用しています)より35%高速です。良いですね。 - Dane
  • 私があなたの解決策に見ることができる唯一の欠点はあなたがそれがしていることを知らない限りそれが少し鈍いということです。二重変換方法を使用することはあなたの意図を福祉コード管理者にとってより明白にします。ところで私はあなたを軽蔑していません。私はあなたの方法も使い始めると思います。ありがとう@aku - Jim Birchall
  • @pilavdzice日付時刻をその日の深夜に設定するする時間を忘れてください。あなたはどんな結果を期待していますか?のdatetimeデータ型は持てません全く時間がない。私はあなたがユーザーのプレゼンテーションとデータストレージを混同していると思います。あなたが欲しいのは時間部分を持たない(ゼロではなく、ただ空白)文字列をユーザに見せる方法であれば、あなたはただ欲しいだけです。Convert(varchar(30), @Date, 101)または似たようなもの。見るSQL Server Books Online•キャストと変換詳しくは - ErikE
  • @ user1671639 datetimeデータ型には常に日付と時刻の両方が含まれていますが、SQL Server 2008を使用している場合を除き、片方を賢明に保存することはできません。日付' & time'データ型このようにCONVERT()を使用する場合は、後で使用する文字列が必要です。そのため、そのようにしないでください。ただし、日付をカットするのではなく日付書式設定関数を使用した方が良いでしょう。オフ - または経由CAST(... AS DATE)またはCONVERT(DATE, ...)これはこのページで頻繁に言及されています。 - Magnus
  • 答えをに変更することをお勧めしますSELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)それからdd他のものと交換することができますdatepartを切り捨てるキーワードdatetime任意のレベルで。 - Michael

673

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

SELECT CONVERT(date, GETDATE())


  • '時間もありますSQL2008のデータ型で、日付と時刻を分離するという質問の残りの部分に答えています。 - misteraidan
  • ちなみに、私は日付から時間を切り捨てるさまざまな方法をベンチマークしましたが、これが最も速い方法でした。違いは小さいのは確かですが、実行回数が多い場合は明らかに速くなりました。 - UnhandledExcepSean
  • SQLServer 2005についてのWT ?? - Dr. MAF
  • @ Dr.MAFこのサークルを完成させた2008年以前の答えはこちらです。stackoverflow.com/questions/113045/… - Frosty840

147

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

select cast(getdate() as date)


  • @FredrickGauss:どのような種類、日付?どのバージョンのSQL Serverを使用していますか? - abatishchev
  • 注意してください。 declare @ date1 datetime =' 2015-09-30 20:59:59.999';選択キャスト(日付として@ date1)を返す' 2015-10-01' - Nick
  • @ニック:これはDateTimeの問題です。つかいますDateTime2代わりに、それはうまく機能します。sqlfiddle.com/#! 6/9eecb7/2833 - abatishchev
  • @Nick、abatishchevからの返信を補完するために、@ date1は本当に2015-10-01、 のためDateTime制限があります。にキャストせずに試すDate、それは降りる2015-10-01も!declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1=>2015-10-01 - Frédéric
  • 覚えやすいSQLトリックの1つです。 Mikeが言うように、2008年以降、しかし2005年以前のDBがどこかにあるとしたら、たくさんの問題があるかもしれません:) - NicVerAZ

69

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

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

set showplan_text on
GO 

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

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


DATETableからSELECT CONVERT(varchar、MyDate、101)

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

DatesTableからSELECT DATEADD(dd、0、DATEDIFF(dd、0、MyDate))

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


  • リカルドC、いい調査だ!どのバージョンのSQLサーバーを使用していますか? datediffを使ったMSSQL2000メソッドでは、私のために少し速く実行します。 - aku
  • ちなみに、私はテストを1000.000回行った。現実のシナリオでは、パフォーマンスの違いはそれほど顕著ではありません、と私は思います - aku
  • Aku、私はこのテストにSQL Server 2005 Expressを使用しました。私は仕事で2000年に取り組んでいます、そして私は2400万行以上のテーブルでそれをテストし、そして何がそこから出てくるかを見るでしょう。 - Ricardo C
  • あく、同じ結果。 1000万行を超えるパフォーマンスに違いはありません。 - Ricardo C
  • 同等のパフォーマンスに関する主張は正しくありません。もちろん、実行計画は同じになります!実行計画を調べるのではなく、CPU使用率を比較することでこれらのパフォーマンスを測定する必要があります。 - ErikE

36

SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))


40

これを試して:

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

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


  • ' 2008/09/22'私のために - eddiegroves
  • 111は日本語フォーマットです。 yyy / mm / dd - Ricardo C
  • SELECT CONVERT(VARCHAR(10)、GETDATE()、101)はmm/dd/yyyyフォーマット。 - Flea
  • 生のテキスト値(DBの外側)に基づいて並べ替えている場合は、日本語の'フォーマットが良い - Simon_Weaver
  • SQL Server 2005上で動作します。 - Raphael Amoedo

18

あなたが使用することができますCONVERT日付のみを返す関数下記のリンクを参照してください。

SQL Server 2000での日付と時刻の操作

キャストとコンバート

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

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


17

日付形式で返す場合

CAST(受注日AS日付)

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

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

SQL Server 2012の場合は、次のコードを使用します。

CONVERT(VARCHAR(10), OrderDate , 111)


  • これは、dateだけでなく、zero timeの日付を返します。 - Bohemian
  • 私はあなたが使用しているSQL Serverの場合はどのバージョンを知ることができますか? - Mahesh ML
  • @MaheshMLこれは、MS SQL 2012では日付と時刻の両方を返します。 - Marek
  • @Marek MS SQL 2008では問題なく動作しています。 - Mahesh ML
  • @MaheshML SQL Server 2010のようなものはありません。 - SvenAelterman

13

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

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


  • この方法は最速ではなく、暗黙のうちにfloat型への日付のキャストは正確であることを人々に教えていますが、そうではありません。見てくださいこの郵便受け詳しくは - ErikE
  • 浮動量子化誤差は怖い - messenger

12

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


11

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

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

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


  • あなたがしたい場合を除いて、言う、問い合わせユーザー指定のものと一致するすべてのレコードを取得します。日付特定の時間フィールドの日付部分として。これはプレゼンテーション層でのみ行うことができます。 (変換する必要はありません。日付演算を使用できますが、アイデアはわかります…) - Andrew Lazarus
  • @そしてなぜそれが重要なのですか。あなたは言うWHERE col >= @Date AND col < DATEADD(DAY, 1, @Date); - 列から時間を削除する理由はまったくありません。 - Aaron Bertrand
  • @AaronBertrandこれは入力を仮定してのみ機能します@Date時間部分がゼロです。それが当てはまらない場合でも、サーバー側で時間を切り捨てる方法を知っておく必要があります。私はこの答えに同意しますが、フォーマットはプレゼンテーション層に委ねるべきだということに同意しますが、フロントエンドのためにそれを残すことはあなたが切り捨てるための素早い方法を知る必要がないという意味に同意しませんでした。 - Andrew Lazarus
  • @入力パラメータをDATEにするだけです。私の主張はそれでもあなたがそのような切り詰めを適用する必要はないはずだということです。カラムたとえそれがほとんどの人の最初の本能だとしても。 - Aaron Bertrand
  • @AaronBertrandとそれパラメータのデータ型を自分で制御できると仮定します。ストアドプロシージャで問題ありませんが、他の状況では不可能です。パラメータが希望するタイプであることを確認するためにキャストしませんか。 - Andrew Lazarus

10

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メソッドを実行します。


  • これらの方法はすべて優れていますが、どの方法を使用することをお勧めしますか。 - eddiegroves
  • 「正しい」ことに注意してください。トップ2のバージョンはselect dateadd(dd, datediff(dd, 0, getdate()), 0)、 なぜならddその後、sは以下のいずれかに交換できます。datepartキーワード選択した任意のセグメントで日付を切り取るには(またddの略語ですday。) - Michael

9

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

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

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


9

あなたが使っているならSQL Server 2012以降のバージョン

つかいますFormat()関数。

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. カスタムの日付と時刻のフォーマット文字列


8

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

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


8

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

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

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

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

1)SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 111))as OnlyDate - 2014-03-26 00:00:00.000

2)SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 112))as OnlyDate - 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


7

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

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03


6

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

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


6

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

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')


  • あなたの最初の例はまだ時間の要素を持っています。問題のポイントはそれをどうやって取り除くかでした。 - Zack

5

昔のMSSQL Server 7.0を使っても、ここのコードは(このおかげで)リンク)私がその時に探していたどんな日付フォーマットも手に入れることができました:

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

DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)


  • 回答の中で何が起こっているのか説明してください。 - Ben
  • この提案は他の回答でカバーされています(複数回)。 - Andriy M

4

私は言及されていなかった以下を支持します:

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

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


4

日付:

SELECT CONVERT(date, GETDATE())
SELECT CAST(GETDATE() as date)

時間:

SELECT CONVERT(time , GETDATE() , 114)
SELECT CAST(GETDATE() as time)


4

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

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


4

SQL Server 2000の場合

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


3

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

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

並べ替えることで、m、d、年の順序を変更できます'%d-%m-%Y'


3

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

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


3

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

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


  • YEarパーツだけを入手するにはどうすればいいですか? - bleykFaust

2

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

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

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

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

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


2

日付(日付と時刻のフィールド)そしてDATE_FORMAT(日付と時刻、 '%Y-%m-%d')両方のリターン日付のみ日付から


  • 質問はSQL Serverを述べています。これはMySQLのようですか? - The1nk

リンクされた質問


関連する質問

最近の質問