0

日付の値からタイムスタンプを削除しようとしているので、mm/dd/yy または mm/dd/yyyy のような結果になります。多くの technet、stackoverflow、および w3schools の記事を参照しましたが、それでも日付が正しく表示されません。テーブル内のすべての列は日時として定義されており、同じテーブルから取得されています。

次のような変換ステートメントを使用しています: CONVERT(VARCHAR(10), E.PD_DT, 101) AS 'Paid Date'

101 の代わりに 10 と 11 を使用しましたが、データには同じ問題があります (以下)。請求調整日-10 列と請求調整日-11 列に見られるように、日付値 (時刻を含まない) が 8 文字の場合、時刻から追加の文字を取得しています。ここに私のデータがあります:

Claim Paid Date-101     Claim Paid Date     Claim Adjustment Date-10    Claim Adjustment Date-11    Claim Adjustment Date
10/23/2012              10/23/12 12:00 AM   9/4/2012 1                  9/4/2012 1                      9/4/12 12:00 AM
10/23/2012              10/23/12 12:00 AM   9/4/2012 1                  9/4/2012 1                      9/4/12 12:00 AM
10/23/2012              10/23/12 12:00 AM   9/4/2012 1                  9/4/2012 1                      9/4/12 12:00 AM
09/06/2011              09/06/11 12:00 AM   9/4/2012 1                  9/4/2012 1                      9/4/12 12:00 AM
10/23/2012              10/23/12 12:00 AM   8/21/2012                   8/21/2012                       8/21/12 12:00 AM
09/06/2011              09/06/11 12:00 AM   8/21/2012                   8/21/2012                       8/21/12 12:00 AM

奇妙なことに、月または日が 10 未満の場合、「請求支払日」列のすべての日付のパディングがゼロになります。ゼロを持っていないということは、私が問題を抱えているところです。

4

2 に答える 2

2

これを行う正しい方法はDATETIME、最初にデータを保存することです。現在、データを文字列として保存していますが、さまざまな理由からこれを行うべきではありません。

  • 最初に変換せずにソートする能力を失います(の9/1/2012後にソートします)。12/12/2012変換には費用がかかります。
  • 最初に変換せずに意味のある範囲クエリを実行する能力を失います (再び9/1/2012> 12/12/2012)
  • 組み込みの検証のすべての手段が失われます - 誰でも13/33/2999または02/32/2099単にfoo「日付」として入力できます
  • DATEADDDATEPARTまたはDATEDIFFこれらの列に対して、最初に変換せずに日付関連の機能を実行できなくなります。
  • 時間をトリムしたり、特定の形式で日付を表示したりできるようにする変換を実行する前に、まず別の型に変換する必要があります

テーブルの設計を修正できず、間違ったデータ型を使用して日付を保存し続けたい場合は、クライアントで文字列を単純にフォーマットすることをお勧めします。クライアントがそれが日付/時刻であることを知っている場合、.Format()or.ToString()を使用すると、任意の形式で時刻なしで日付を表示できます。

一部の読者にはいつ表示されるかわからず、それが 6 月 12 日なのか 12 月 6 日なのかもわからないため、明確な形式で日付をユーザーに提示する必要があります (たとえば、カナダ人とアメリカ人では日付の見方が異なります) 6/12/2012したがって、例として次のように使用できます。

DateVariable.Format('yyyy-MM-dd')

これにより、2012 年 6 月 12 日のような明確な日付が表示されますが、これはフランスの一部の非常に孤立した地域や年齢層でのみ誤解される可能性があります (ydm が依然として流行しているようです)。

ただし、あいまいな形式を絶対に表示したい場合は、次を使用できます。

DateVariable.Format('MM/dd/yyyy')

...SQLクエリを変更する理由はまったくありません。何らかの理由で、クエリレベルでこれを絶対に実行したい、または実行する必要がある場合は、次を使用できます。

SELECT CONVERT(CHAR(10), CONVERT(DATE, col), 101) -- mm/dd/yyyy

yyyymmddまたはのようなあいまいさの少ない形式を使用する場合はyyyy-mm-dd、次を使用できます。

SELECT CONVERT(CHAR(8),  CONVERT(DATE, col), 112) -- yyyymmdd
SELECT CONVERT(CHAR(10), CONVERT(DATE, col), 120) -- yyyy-mm-dd

ただし、データベース レイヤーでの変換にはコストがかかりますが、クライアント レイヤー (最終ステップで既にこれらを文字列として処理している場所) での文字列の書式設定は比較的安価です。これらは、データベースに出入りする途中でも、できるだけ長く日付値として保持する必要があります。SQL Server が関係する場所では、それらを文字列として扱う利点はありません。

だから、要約

  1. テーブルを修正する
  2. クライアントで変換を実行します(できれば明確な形式に)
  3. クライアントで変換を実行できない場合は、二重ネストを使用しますCONVERT(ここでも、できれば明確な形式にします)。
于 2013-09-24T18:32:53.117 に答える