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
について考える必要はありませんSQLServer 2008には、日付コンポーネントのみが含まれる「date」データ型があります。 SQLServer 2008以降を使用している人は誰でも次のことができます。
SELECT CONVERT(date, GETDATE())
SQL 2008以降を使用している場合
select cast(getdate() as date)
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に変換するよりもかなり速いことを証明します。
これを試して:
SELECT CONVERT(VARCHAR(10),GETDATE(),111)
上記のステートメントはあなたの現在のフォーマットをYYYY/MM/DD
に変換します、あなたの望ましいフォーマットを選ぶために このリンク を参照してください。
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
日付だけを返すためにCONVERT
関数を使うことができます。下記のリンクを参照してください。
Convert関数を使用するための構文は次のとおりです。
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
日付形式で返す場合
CAST(受注日AS日付)
上記のコードは、SQL Server 2010で動作します
12/12/2013のように戻ります
SQL Server 2012の場合、以下のコードを使用します
CONVERT(VARCHAR(10), OrderDate , 111)
FLOOR()を使用して - ちょうど時間の一部をカット。
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
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です。
ちょっと私のsoapboxに乗ることができるならば、 この種のフォーマットはデータ層 に属していません、そしてそれはそれが愚かに高いオーバーヘッド 'トリック'なしでは不可能だった理由です実際のdatepartデータ型が導入されたSQL Server 2008まで。データ層でこのような変換を行うことはDBMSのオーバーヘッドの大きな浪費ですが、さらに重要なことは、このようなことを2回目に行った場合、基本的にはインメモリの孤立データを作成したことです。別の3NF +列に戻したり、元に戻すことなく入力したものと比較したりすることはできません。したがって、これまでの作業で失敗した点が発生し、リレーショナル参照が削除されます。
必ず先に進み、dateTimeデータ型を呼び出し側プログラムに戻して、 PRESENTATION層に戻して、必要な調整を行ってください。 呼び出し元に返す前に変換を始めるとすぐに、アプリケーションから参照整合性の期待をすべて取り除いていることになります。これはUPDATEまたはDELETE操作を防ぐためのものです。手動の復帰操作を何もしない限り、これも必要ありません。データをhuman/code/gremlinエラーにさらすことになります。
Format()
functionを使用してください。
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日
もっとフォーマットが欲しいなら、あなたはに行くことができます:
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 CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
私はそれが便利だと思います。
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
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
さて、私は少し遅れていますが:)、これはもう一つの解決策です。
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')
私はこれがあなたの場合にはうまくいくと思います:
CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
古代の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
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'
SELECT CONVERT(DATE, @yourdate)
SQL SERVER 2012以降、これを実行できます。
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')
私は言及されていない次のことを支持します。
DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))
それぞれの 'datepart'はおそらく数学を行いますが、それはまた、ローカルを気にしたり二重変換をしたりしません。それで、それはdatediff方法より少し遅いかもしれません、しかし私にとってそれははるかに明確です。特に年と月だけでグループ化したい場合(1に日を設定します)。
SQL Server 2000の場合
CAST(
(
STR( YEAR( GETDATE() ) ) + '/' +
STR( MONTH( GETDATE() ) ) + '/' +
STR( DAY( GETDATE() ) )
)
AS DATETIME)
日付:
SELECT CONVERT(日付、GETDATE()) SELECT CAST(日付としてGETDATE())
時間:
SELECT CONVERT(時間、GETDATE()、114) SELECT CAST(時間として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
なぜ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の順番を変えることができます。
これはすべての答えに欠けていた、最も効率的ではないが書くことおよび理解することが非常に簡単である必要はなく、スタイルも複雑でも、複雑な日付関数もない。
SELECT CONVERT(DATETIME,CONVERT(DATE,((GETDATE()))))
日付(日付と時刻のフィールド) および DATE_FORMAT(日付と時刻、 '%Y-%m-%d') 両方の戻り値 日付のみ 日付と時刻から
SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'
日付部分と日付のフォーマットには、次のものを使用できます。
DATENAME =>指定された日付の指定された日付部分を表す文字ストリングを返します
DATEADD => DATEPART()
関数は、年、月、日、時、分などの日付/時刻の一部を返すために使用されます。
DATEPART =>指定された日付の指定された日付部分を表す整数を返します。
CONVERT()
=> CONVERT()
関数は、あるデータ型の式を別のデータ型に変換する一般的な関数です。 CONVERT()
関数は、日付/時刻データをさまざまな形式で表示するために使用できます。
私はこれが古いことを知っています、しかし私は誰もがこのようにそれを述べたところで見ません。私が言えることから、これはANSI規格です。
SELECT CAST(CURRENT_TIMESTAMP AS DATE)
マイクロソフトがANSI標準のCURRENT_DATE変数もサポートできればそれは良いでしょう。
SQL 2008以降を使用している場合:SELECT CONVERT(DATE ,GETDATE())
これを試して:
SELECT CONVERT(date, GETDATE()) as date
時間を使わずに日付を取得するための私の共通のアプローチ
SELECT CONVERT(VARCHAR(MAX),GETDATE(),103)
SELECT CAST(GETDATE() AS DATE)
日付に2008-09-22 00:00:00.000
を表示する場合
それからあなたはそれを使ってそれを丸めることができます
SELECT CONVERT(datetime, (ROUND(convert(float, getdate()-.5),0)))
これにより、質問の形式で日付が表示されます
cONVERT(datetime、CONVERT(date、getdate()))te)としてconvert(getdate()を選択します。)
あなたは日付だけのための異なったタイプの出力のために下記のように使うことができます
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 103))
----- dd/mm/yyyy
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
------ mm/dd/yyyy
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 102))
select cast(createddate as date) as derivedate from table
createdateはあなたのdatetimeカラムです。これはsqlserverで動作します。
SELECT CONVERT(date、getdate())
以下のコードを使用すると、日付部分のみを取得し、SQL部分の時間部分を避けることができます。
SELECT SYSDATE TODAY FROM DUAL;
最も簡単な方法は次のものを使うことです。SELECT DATE(GETDATE())
うわー、あなたがこれを行うことができる方法を数えてみましょう。 (駄目なし)
あなたが具体的にこのフォーマットで欲しい結果を得るために:
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になぜそのような冗長性があるのですか?
私にはわかりませんが、彼らにはわかります。たぶん私より賢い人がその質問に答えることができます。
これが誰かに役立つことを願っています。
私のスタイル
select Convert(smalldatetime,Convert(int,Convert(float,getdate())))