14

私は次のようにデータベースにクエリを実行しています:

SELECT DISTINCT 
CASE WHEN CreatedDate = '1900-01-01 00:00:00.000' THEN '' ELSE CreatedDate END AS CreatedDate
FROM LitHoldDetails

lhd.CreatedDateはDateTimeフィールドであり、null許容ではありません。フィールドが最小日付(1/1/1900)の場合、空の文字列を表示したいのですが、CASEステートメントが機能しません。CreatedDateは、その値がデータベースにある場合、クエリに1900-01-01 00:00:00.000を表示します。SQL Server2008R2を使用しています。私は何が間違っているのですか?

4

7 に答える 7

29

CASE式 ( statementではない)を使用する場合は、データ型の優先順位に注意する必要があります。この場合、 aDATETIMEを空の文字列に設定することはできません。それを試してみてください:

SELECT CONVERT(DATETIME, '');

1 つの回避策は、日付を文字列として表示することです。

CASE WHEN CONVERT(DATE, CreatedDate) = '1900-01-01' -- to account for accidental time
  THEN ''
  ELSE CONVERT(CHAR(10), CreatedDate, 120)
    + ' ' + CONVERT(CHAR(8), CreatedDate, 108)
END 

または、プレゼンテーション層で、それが属するプレゼンテーションのものをいじることができます。

あなたが望むように正確に動作する例を次に示します。

DECLARE @d TABLE(CreatedDate DATETIME);

INSERT @d SELECT '19000101' UNION ALL SELECT '20130321';

SELECT d = CASE WHEN CreatedDate = '19000101'
  THEN ''
  ELSE CONVERT(CHAR(10), CreatedDate, 120)
    + ' ' + CONVERT(CHAR(8), CreatedDate, 108)
END FROM @d;

結果:

d
-------------------
                    <-- empty string
2013-03-21 00:00:00
于 2013-03-21T17:39:43.343 に答える
7
select  ISNULL(CONVERT(VARCHAR(23), WorkingDate,121),'') from uv_Employee
于 2014-06-20T05:53:06.797 に答える
4

このコードを試してください

(case when CONVERT(VARCHAR(10), CreatedDate, 103) = '01/01/1900' then '' else CONVERT(VARCHAR(24), CreatedDate, 121) end) as Date_Resolved
于 2015-11-27T10:37:55.673 に答える
2

CASTデータVARCHAR()を明示的に ing する代わりにデータを使用する場合CONVERTは、単純に

SELECT REPLACE(CAST(CreatedDate AS VARCHAR(20)),'Jan  1 1900 12:00AM','')

CAST自動的に日付を返し、Jun 18 2020 12:46PMさらに追加できる固定長の文字列形式として返しますSUBSTRING()

SELECT SUBSTRING(REPLACE(CAST(CreatedDate  AS VARCHAR(20)),'Jan  1 1900 12:00AM',''),1,11)

出力

Jun 18 2020
于 2020-09-25T10:34:39.187 に答える
0

2つのつまらないもの。(1) 列のエイリアスに文字列リテラルを使用しないことをお勧めします。これは非推奨です。(2) スタイル 120 を使用して同じ値を取得します。

    CASE 
      WHEN CreatedDate = '19000101' THEN '' 
      WHEN CreatedDate = '18000101' THEN '' 
      ELSE Convert(varchar(19), CreatedDate, 120)
    END AS [Created Date]
于 2015-07-02T14:15:25.107 に答える
0

これをクエリ内で使用します。追加の変数を作成する必要はありません。

CASE WHEN CreatedDate = '19000101' THEN '' WHEN CreatedDate =
'18000101' THEN ''  ELSE CONVERT(CHAR(10), CreatedDate, 120) + ' ' +
CONVERT(CHAR(8), CreatedDate, 108) END as 'Created Date'

魅力のように機能します。

于 2014-07-01T15:47:14.247 に答える
0

最小 (1900 年 1 月 1 日) と最大 (2079 年 6 月 6 日) の両方の日付をカバーする代替ソリューション:

ISNULL(NULLIF(NULLIF(CONVERT(VARCHAR(10), CreatedDate, 120), '1900-01-01'), '2079-06-06'), '').

どのようなソリューションを使用する場合でも、日付 (または日時) フィールドを特定の形式に変換して、さまざまな既定のサーバー構成に対して防弾対策を講じる必要があります。

MSDN の CAST と CONVERT を参照してください: https://msdn.microsoft.com/en-us/library/ms187928.aspx

于 2016-07-06T17:37:58.357 に答える