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
datetime
データ型は持てません全く時間がない。私はあなたがユーザーのプレゼンテーションとデータストレージを混同していると思います。あなたが欲しいのは時間部分を持たない(ゼロではなく、ただ空白)文字列をユーザに見せる方法であれば、あなたはただ欲しいだけです。Convert(varchar(30), @Date, 101)
または似たようなもの。見るSQL Server Books Online•キャストと変換詳しくは - ErikECAST(... AS DATE)
またはCONVERT(DATE, ...)
これはこのページで頻繁に言及されています。 - MagnusSELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)
それからdd
他のものと交換することができますdatepart
を切り捨てるキーワードdatetime
任意のレベルで。 - Michael
SQLServer 2008には、日付コンポーネントのみが含まれる「日付」データ型があります。 SQLServer 2008以降を使用している人は誰でも次のことができます。
SELECT CONVERT(date, GETDATE())
SQL 2008以降を使用している場合
select cast(getdate() as date)
DateTime2
代わりに、それはうまく機能します。sqlfiddle.com/#! 6/9eecb7/2833 - abatishchev2015-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
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に変換するよりもかなり速いことを証明しています。
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
これを試して:
SELECT CONVERT(VARCHAR(10),GETDATE(),111)
上記のステートメントはあなたの現在のフォーマットをに変換します。YYYY/MM/DD
を参照してくださいこのリンクご希望のフォーマットを選択してください。
mm/dd/yyyy
フォーマット。 - Flea
あなたが使用することができますCONVERT
日付のみを返す関数下記のリンクを参照してください。
convert関数を使用するための構文は次のとおりです。
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
日付形式で返す場合
CAST(受注日AS日付)
上記のコードは、SQL Server 2010で動作します
12/12/2013のように戻ります
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
あなたが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エラーにさらしているある種の手動の復帰をしない限り。
WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);
- 列から時間を削除する理由はまったくありません。 - Aaron Bertrand@Date
時間部分がゼロです。それが当てはまらない場合でも、サーバー側で時間を切り捨てる方法を知っておく必要があります。私はこの答えに同意しますが、フォーマットはプレゼンテーション層に委ねるべきだということに同意しますが、フロントエンドのためにそれを残すことはあなたが切り捨てるための素早い方法を知る必要がないという意味に同意しませんでした。 - Andrew Lazarus
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メソッドを実行します。
select dateadd(dd, datediff(dd, 0, getdate()), 0)
、 なぜならdd
その後、sは以下のいずれかに交換できます。のdatepart
キーワード選択した任意のセグメントで日付を切り取るには(またdd
の略語ですday
。) - Michael
示された結果を得るために、私は以下のコマンドを使います。
SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
私はそれが便利だと思います。
つかいますFormat()
関数。
SQL Serverには、すでに複数の回答とフォーマットの種類があります。 しかし、ほとんどの方法は多少あいまいであり、特定の日付フォーマットに関してフォーマットタイプや関数の番号を覚えておくのは難しいでしょう。そのため、SQL Serverの次期バージョンではより良い選択肢があります。
FORMAT ( value, format [, culture ] )
あなたはあなたの視聴者に従って日付を指定することができるのでカルチャーオプションはとても役に立ちます。
あなたはd(小さなパターンの場合)と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)
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日
もっと多くのフォーマットが欲しいなら、あなたはに行くことができます:
Convert(nvarchar(10), getdate(), 101) ---> 5/12/14
Convert(nvarchar(12), getdate(), 101) ---> 5/12/2014
結果が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
結果を列または変数に割り当てる場合は、それに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
私は言及されていなかった以下を支持します:
DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))
それはまた、ローカルを気にすることもダブルコンバートをすることもしません - それぞれの 'datepart'はおそらく数学を行います。だからdatediffの方法より少し遅くなるかもしれませんが、私にはそれがはるかに明確です。特に年と月だけでグループ化したい場合(1に日を設定します)。
日付:
SELECT CONVERT(date, GETDATE()) SELECT CAST(GETDATE() as date)
時間:
SELECT CONVERT(time , GETDATE() , 114) SELECT CAST(GETDATE() as time)
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)
なぜ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'
部
これはすべての答えで欠けていた、最も効率的ではないかもしれないが書くことおよび理解することが非常に簡単である必要はなく、スタイルも複雑でもなく、複雑な日付関数もない。
SELECT CONVERT(DATETIME,CONVERT(DATE,((GETDATE()))))
単純にこうすることができます。
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
日付部分と日付のフォーマットには、次のものを使用できます。
DATENAME =>指定された日付の指定された日付部分を表す文字ストリングを返します
DATEADD =>DATEPART()
この関数は、年、月、日、時、分などの日付/時刻の一部を返すために使用されます。
DATEPART =>指定された日付の指定された日付部分を表す整数を返します。
CONVERT()
=>CONVERT()
functionは、あるデータ型の式を別のデータ型に変換する一般的な関数です。
のCONVERT()
関数を使用して、日付/時刻データをさまざまな形式で表示できます。
日付(日付と時刻のフィールド)そしてDATE_FORMAT(日付と時刻、 '%Y-%m-%d')両方のリターン日付のみ日付から