SQL Serverのカスタムの日付/時刻形式
-
03-07-2019 - |
質問
テーブルから列を選択し、ResultSetに2つの列を追加するストアドプロシージャを記述しようとしています。これらの2つの追加列は、Datetimeフィールドであるテーブル内のフィールドでの変換の結果です。
日時形式フィールドの形式は次のとおりです 'YYYY-MM-DD HH:MM:SS.S'
次の形式にする必要がある2つの追加フィールド:
- DDMMM
- HHMMT、Tは午前の場合は「A」、午後の場合は「P」
例:フィールドのデータが '2008-10-12 13:19:12.0'の場合、抽出されたフィールドには以下が含まれている必要があります。
- 12OCT
- 0119P
CONVERT文字列形式を使用しようとしましたが、取得したい出力に一致する形式はありません。 CONVERTを介してフィールドデータを抽出し、次にREPLACEを使用するという方針に沿って考えていますが、確かではないので、ここで確かに助けが必要です。
ストアドプロシージャに精通している人はここで助けてくれますか? ありがとう!
解決
dtがdatetime列の場合、
1の場合:
SUBSTRING(CONVERT(varchar, dt, 13), 1, 2)
+ UPPER(SUBSTRING(CONVERT(varchar, dt, 13), 4, 3))
2の場合:
SUBSTRING(CONVERT(varchar, dt, 100), 13, 2)
+ SUBSTRING(CONVERT(varchar, dt, 100), 16, 3)
他のヒント
DATENAMEを使用し、ロジックをストアドプロシージャではなく関数でラップします
declare @myTime as DateTime
set @myTime = GETDATE()
select @myTime
select DATENAME(day, @myTime) + SUBSTRING(UPPER(DATENAME(month, @myTime)), 0,4)
" 14OCT"を返します
日付を使用する場合は、可能であれば文字/文字列ベースの操作を使用しないでください。これらは数値(浮動小数点数)であり、パフォーマンスはこれらのデータ型変換の影響を受けます。
長年にわたってコンパイルしてきたこれらの便利な変換を調べます...
/* Common date functions */
--//This contains common date functions for MSSQL server
/*Getting Parts of a DateTime*/
--//gets the date only, 20x faster than using Convert/Cast to varchar
--//this has been especially useful for JOINS
SELECT (CAST(FLOOR(CAST(GETDATE() as FLOAT)) AS DateTime))
--//gets the time only (date portion is '1900-01-01' and is considered the "0 time" of dates in MSSQL, even with the datatype min value of 01/01/1753.
SELECT (GETDATE() - (CAST(FLOOR(CAST(GETDATE() as FLOAT)) AS DateTime)))
/*Relative Dates*/
--//These are all functions that will calculate a date relative to the current date and time
/*Current Day*/
--//now
SELECT (GETDATE())
--//midnight of today
SELECT (DATEADD(ms,-4,(DATEADD(dd,DATEDIFF(dd,0,GETDATE()) + 1,0))))
--//Current Hour
SELECT DATEADD(hh,DATEPART(hh,GETDATE()),CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DateTime))
--//Current Half-Hour - if its 9:36, this will show 9:30
SELECT DATEADD(mi,((DATEDIFF(mi,(CAST(FLOOR(CAST(GETDATE() as FLOAT)) as DateTime)), GETDATE())) / 30) * 30,(CAST(FLOOR(CAST(GETDATE() as FLOAT)) as DateTime)))
/*Yearly*/
--//first datetime of the current year
SELECT (DATEADD(yy,DATEDIFF(yy,0,GETDATE()),0))
--//last datetime of the current year
SELECT (DATEADD(ms,-4,(DATEADD(yy,DATEDIFF(yy,0,GETDATE()) + 1,0))))
/*Monthly*/
--//first datetime of current month
SELECT (DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0))
--//last datetime of the current month
SELECT (DATEADD(ms,-4,DATEADD(mm,1,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0))))
--//first datetime of the previous month
SELECT (DATEADD(mm,DATEDIFF(mm,0,GETDATE()) -1,0))
--//last datetime of the previous month
SELECT (DATEADD(ms, -4,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)))
/*Weekly*/
--//previous monday at 12AM
SELECT (DATEADD(wk,DATEDIFF(wk,0,GETDATE()) -1 ,0))
--//previous friday at 11:59:59 PM
SELECT (DATEADD(ms,-4,DATEADD(dd,5,DATEADD(wk,DATEDIFF(wk,0,GETDATE()) -1 ,0))))
/*Quarterly*/
--//first datetime of current quarter
SELECT (DATEADD(qq,DATEDIFF(qq,0,GETDATE()),0))
--//last datetime of current quarter
SELECT (DATEADD(ms,-4,DATEADD(qq,DATEDIFF(qq,0,GETDATE()) + 1,0)))
SQLサーバーで次のコマンドを使用して作成できます。
select FORMAT(getdate(), N'yyyy-MM-ddThh:mm:ss')
あなたの質問に具体的には答えませんが、それはあなたのアプリケーションのプレゼンテーション層によって処理されるべきものではありません。あなたが説明する方法でそれを行うと、データベース側で余分な処理が作成され、余分なネットワークトラフィックが追加されます(データベースがアプリケーションとは異なるマシンに存在すると仮定します)特に短縮された月名を含む最初の例の場合は、より多くの言語に依存しないだけでなく、ライブラリを処理します。とにかく、他の人があなたに与える答えは、あなたがまだこのルートに行くことに決めたなら、あなたを正しい方向に向けるべきです。
日時形式フィールドの形式は次のとおりです 'YYYY-MM-DD HH:MM:SS.S'
その文は偽です。これが、Enterprise ManagerまたはSQL Serverが日付を表示する方法です。内部的には8バイトのバイナリ値であるため、Andrewによって投稿された関数の一部は非常にうまく機能します。
Kibbeeも同様に正当な点を指摘しており、完璧な世界では彼に同意するでしょう。ただし、クエリ結果をコントロールまたはウィジェットを表示するために直接バインドしたい場合があり、実際にはフォーマットを実行する機会はありません。また、プレゼンテーションレイヤーは、データベースよりもさらにビジーなWebサーバー上に存在する場合があります。これらを念頭に置いて、SQLでこれを行う方法を知ることは必ずしも悪いことではありません。
はい出発はその解決策ですが、この種の方法は長い旅だと思います!
SQLサーバー:
SELECT CAST(DATEPART(DD,GETDATE()) AS VARCHAR)+'/'
+CAST(DATEPART(MM,GETDATE()) AS VARCHAR)
+'/'+CAST(DATEPART(YYYY,GETDATE()) AS VARCHAR)
+' '+CAST(DATEPART(HH,GETDATE()) AS VARCHAR)
+':'+CAST(DATEPART(MI,GETDATE()) AS VARCHAR)
Oracle:
Select to_char(sysdate,'DD/MM/YYYY HH24:MI') from dual
この混乱を取り除くことができるこの方法で独自の関数を書くことができます;
http://sql.dzone.com/news/custom- date-formatting-sql-ser
select myshortfun(getdate(),myformat)
GO
ここでDATEPARTが必要になります。 DATEPART呼び出しの結果を連結することができます。
月の省略形を取得するには、DATENAMEを使用できます。それがうまくいかない場合は、DATEPARTでCASEステートメントを使用できます。
DATEPARTは時間フィールドでも機能します。
DATEPARTで作成された新しい日付の比較や、1日の合計経過秒数の計算、既知のAM / PMしきい値との比較など、AM / PMインジケーターを取得するいくつかの方法を考えることができます。
MS SQL Serverでできること:
DATEFORMAT ymdを設定
年、 月、 日、
ディメンションモデルに必要なのが DateKey
( yyyymmdd
)のようなより具体的なものである場合、キャスト/変換のないものをお勧めします:
DECLARE @DateKeyToday int = (SELECT 10000 * DATEPART(yy,GETDATE()) + 100 * DATEPART(mm,GETDATE()) + DATEPART(dd,GETDATE()));
PRINT @DateKeyToday
カスタム回答に関連するものとして、この回答を(自分用に)追加しています。
アンダースコアyyyy_MM_ddの場合
REPLACE(SUBSTRING(CONVERT(VARCHAR, @dt, 120), 1, 10),'-','_')