質問

SELECT GETDATE()

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

時刻部分を除いた日付部分が必要です。 2008-09-22 00:00:00.000

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

役に立ちましたか?

解決

の上 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

によって提案されたように マイケル

このバリアントを使用します。 SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, getdate()))

select getdate()

SELECT DATEADD(hh, DATEDIFF(hh, 0, getdate()), 0)
SELECT DATEADD(hh, 0, DATEDIFF(hh, 0, getdate()))

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

SELECT DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0)
SELECT DATEADD(mm, 0, DATEDIFF(mm, 0, getdate()))

SELECT DATEADD(yy, DATEDIFF(yy, 0, getdate()), 0)
SELECT DATEADD(yy, 0, DATEDIFF(yy, 0, getdate()))

出力:

2019-04-19 08:09:35.557

2019-04-19 08:00:00.000
4763-02-17 00:00:00.000

2019-04-19 00:00:00.000
2019-04-19 00:00:00.000

2019-04-01 00:00:00.000
1903-12-03 00:00:00.000

2019-01-01 00:00:00.000
1900-04-30 00:00:00.000

他のヒント

SQLServer 2008 には、時刻コンポーネントを含まない日付のみを含む「日付」データ型が追加されました。SQLServer 2008 以降を使用している人は誰でも、次のことを実行できます。

SELECT CONVERT(date, GETDATE())

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

select cast(getdate() as date)

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 に変換するよりも大幅に高速であることを証明しています。

これを試して:

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

上記のステートメントは、現在の形式を次のように変換します。 YYYY/MM/DD, を参照してください。 このリンク をクリックして好みの形式を選択します。

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

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

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

キャストと変換

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

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

日付形式で返す場合

CAST(日付としての注文日)

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

2013 年 12 月 12 日のように戻ります

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

CONVERT(VARCHAR(10), OrderDate , 111)
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

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

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

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

使用 Format() 関数。

SQL サーバーにはすでに複数の回答と書式設定タイプがあります。しかし、ほとんどのメソッドはやや曖昧で、特定の日付形式に関する形式の種類や関数の数値を覚えるのは困難です。そのため、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. カスタムの日付と時刻の形式文字列

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

ちょっと石鹸箱に乗れたら この種の形式はデータ層に属しません, 実際の datepart データ型が導入される SQL Server 2008 までは、愚かでオーバーヘッドの高い「トリック」がなければ不可能であったのはそのためです。データ層でこのような変換を行うことは、DBMS でのオーバーヘッドの膨大な無駄ですが、さらに重要なのは、このようなことを行うと、基本的にメモリ内に孤立したデータが作成され、その後プログラムに戻ることになると思います。元に戻さずにそれを別の 3NF+ 列に戻したり、入力されたものと比較したりすることはできないため、失敗点が導入され、リレーショナル参照が削除されただけになります。

常に先に進んで、呼び出し側プログラムに dateTime データ型を返す必要があります。 プレゼンテーション層で、必要な調整を行います。 呼び出し元に返す前に変換を開始すると、アプリケーションから参照整合性の期待がすべて失われることになります。これにより、何らかの手動復帰を行わない限り、再び UPDATE または DELETE 操作ができなくなります。これにより、必要のないときにデータがヒューマン/コード/グレムリン エラーにさらされることになります。

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 への変換メソッドよりも優れています。

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

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

お役に立てば幸いです。

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)) OnlyDate として --2014-03-26 00:00:00.000

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

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

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

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

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03

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

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

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

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

古い 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
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)

日付:

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

時間:

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

私は言及されていない以下の点を支持します。

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

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

SQL SERVER 2012 以降では、次のことが可能になります。

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

SQL Server 2000 の場合

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

単純に次の方法で実行できます。

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

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

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

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

これが古いことは知っていますが、このように述べた人はどこにもいません。私の知る限り、これは ANSI 規格です。

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

Microsoft が ANSI 標準の CURRENT_DATE 変数もサポートできれば良いのにと思います。

これはすべての回答に欠落しており、最も効率的ではないかもしれませんが、非常に書きやすく理解しやすく、スタイルも必要なく、複雑な日付関数も必要ありません。

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

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

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top