SELECT GETDATE()
戻り値:2008-09-22 15:24:13.790
時間の部分なしでその日付の部分が欲しい:2008-09-22 00:00:00.000
どうすればそれを取得できますか?
SELECT GETDATE()
戻り値:2008-09-22 15:24:13.790
時間の部分なしでその日付の部分が欲しい:2008-09-22 00:00:00.000
どうすればそれを取得できますか?
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
例えば
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
私にくれます
2008-09-22 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))
日付形式で返す場合
CAST(OrderDate AS date)
上記のコードは、SQL Server 2010 で動作します。
2013 年 12 月 12 日のように返されます
SQL Server 2012 の場合、以下のコードを使用します
CONVERT(VARCHAR(10), OrderDate , 111)
この関数を使用してCONVERT
、日付のみを返すことができます。以下のリンクを参照してください。
convert関数を使用するための構文は次のとおりです。
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
関数を使用Format()
します。
SQL サーバーには、既に複数の回答とフォーマット タイプがあります。ただし、ほとんどのメソッドはややあいまいであり、特定の日付形式に関する形式タイプまたは機能の数字を覚えておくのは難しいでしょう。そのため、次のバージョンの SQL サーバーにはより良いオプションがあります。
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 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)
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操作が防止されます。これにより、必要がないときにデータがヒューマン/コード/グレムリンエラーにさらされます。
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()))
便利だと思います。
Convert(nvarchar(10), getdate(), 101) ---> 5/12/14
Convert(nvarchar(12), getdate(), 101) ---> 5/12/2014
さて、少し遅れましたが:)、別の解決策があります。
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 に設定)。
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
'%d-%m-%Y'
パーツを再配置することで、m、d、および年の順序を変更できます
SQL SERVER 2012 以降では、次の操作を実行できます。
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')
これが古いことは知っていますが、誰かがこのように述べた場所は見当たりません。私が知る限り、これは ANSI 標準です。
SELECT CAST(CURRENT_TIMESTAMP AS DATE)
Microsoft が ANSI 標準の CURRENT_DATE 変数もサポートできるとよいでしょう。
SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'
Date(date&time field)とDATE_FORMAT(date&time,'%Y-%m-%d')はどちらも date&time から日付のみを返します
以下のコードを使用して、日付部分のみを取得し、SQL の時刻部分を避けることができます。
SELECT SYSDATE TODAY FROM DUAL;