2016
SELECT GETDATE()

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

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

どうすればそれを取得できますか?

4

44 に答える 44

2727
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変換は必要ありません
  • ロケールについて考える必要はありません
于 2008-09-22T03:34:16.873 に答える
796

SQLServer 2008には、時間コンポーネントのない日付のみを含む「日付」データ型があります。SQLServer 2008以降を使用している場合は、次の操作を実行できます。

SELECT CONVERT(date, GETDATE())
于 2008-09-24T13:02:21.577 に答える
197

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

select cast(getdate() as date)
于 2011-01-31T09:44:38.633 に答える
83

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

クエリの実行計画を表示するには:

set showplan_text on
GO 

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

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


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 への変換よりも大幅に高速であることを証明する完全なテスト スクリプトとパフォーマンス結果です。

于 2008-09-22T08:04:09.923 に答える
59

これを試して:

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

上記のステートメントは、現在の形式をに変換します。このリンクYYYY/MM/DDを参照して、希望する形式を選択してください。

于 2008-09-22T03:33:29.137 に答える
45
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
于 2008-09-22T03:33:53.253 に答える
27

日付形式で返す場合

CAST(OrderDate AS date)

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

2013 年 12 月 12 日のように返されます

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

CONVERT(VARCHAR(10), OrderDate , 111)
于 2013-12-19T06:48:07.263 に答える
23

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

SQLServer2000での日付と時刻の操作

キャストと変換

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

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 
于 2008-09-22T03:34:43.393 に答える
20

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

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

SQL サーバーには、既に複数の回答とフォーマット タイプがあります。ただし、ほとんどのメソッドはややあいまいであり、特定の日付形式に関する形式タイプまたは機能の数字を覚えておくのは難しいでしょう。そのため、次のバージョンの SQL サーバーにはより良いオプションがあります。

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. カスタムの日付と時刻の書式文字列
于 2016-08-24T07:36:10.647 に答える
17
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
于 2011-09-22T12:21:32.920 に答える
16

FLOOR() を使用する - 時間の部分をカットするだけです。

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
于 2008-09-22T07:38:59.953 に答える
14

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

少しの間soapboxに乗ることができれば、この種のフォーマットはデータ層に属していません。そのため、実際の日付部分のデータ型がSQL Server 2008になるまで、オーバーヘッドの高い「トリック」がなければ不可能でした。紹介された。データ層でこのような変換を行うと、DBMSのオーバーヘッドが大幅に浪費されますが、さらに重要なことに、このようなことを2回行うと、基本的にメモリ内の孤立したデータが作成され、プログラムに戻ると思います。別の3NF+列に戻したり、元に戻さずに入力したものと比較したりすることはできません。そのため、障害点を導入し、リレーショナル参照を削除するだけです。

常に先に進んで、dateTimeデータ型を呼び出し元のプログラムに返し、PRESENTATION層で、必要な調整を行う必要があります。呼び出し元に返す前に変換を行うとすぐに、アプリケーションから参照整合性のすべての希望が削除されます。これにより、ある種の手動復帰を行わない限り、UPDATEまたはDELETE操作が防止されます。これにより、必要がないときにデータがヒューマン/コード/グレムリンエラーにさらされます。

于 2012-07-26T20:00:30.210 に答える
12
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つのメソッドは基本的に同じであり、varcharメソッドへの変換を実行します。

于 2008-09-22T03:35:23.250 に答える
12

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

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

便利だと思います。

于 2013-11-17T17:36:27.173 に答える
9
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014
于 2014-05-12T14:41:48.300 に答える
7

さて、少し遅れましたが:)、別の解決策があります。

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')
于 2016-04-13T10:46:30.673 に答える
6

古代の 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
于 2015-02-27T21:16:05.370 に答える
5

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

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

また、ローカルを気にしたり、二重変換を行ったりすることもありません-ただし、各「datepart」はおそらく計算を行います。そのため、datediff メソッドよりも少し遅いかもしれませんが、私にははるかに明確です。特に、年と月だけでグループ化したい場合 (日を 1 に設定)。

于 2015-04-30T19:00:38.083 に答える
5

SQL Server 2000 の場合

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)
于 2016-05-24T09:36:18.633 に答える
5

DATE_FORMAT( your_datetiem_column, '%d-%m-%Y' ) を使用しないのはなぜですか?

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

'%d-%m-%Y'パーツを再配置することで、m、d、および年の順序を変更できます

于 2014-05-17T05:46:19.993 に答える
5

SQL SERVER 2012 以降では、次の操作を実行できます。

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

于 2016-07-20T15:58:29.473 に答える
5

これが古いことは知っていますが、誰かがこのように述べた場所は見当たりません。私が知る限り、これは ANSI 標準です。

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

Microsoft が ANSI 標準の CURRENT_DATE 変数もサポートできるとよいでしょう。

于 2016-01-15T18:14:06.703 に答える
4
SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'
于 2015-09-01T13:02:45.503 に答える
4

Date(date&time field)DATE_FORMAT(date&time,'%Y-%m-%d')はどちらも date&time から日付のみを返します

于 2015-07-08T06:28:44.247 に答える
-1

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

SELECT SYSDATE TODAY FROM DUAL; 
于 2016-03-29T22:56:51.553 に答える