1

2 つの日付列を持つテーブルがあります。ただし、列は varchar です。それらを日付形式に変換する必要があります。

サンプルデータは次のようになります。

口座番号 | 登録日 | システム状態変更日

01740567715 | 2013 年 7 月 10 日 | 2013 年 7 月 30 日 12.53.32.000000000 PM

10-Jul-2013 のように、これらの列の両方が必要です。

登録日については、次のコードを使用しています。

Update [dbo].[SysDataV2] 
Set ["REGISTRATION_DATE"]= convert(datetime, (["REGISTRATION_DATE"]), 106)

しかし、結果は varchar として表示され、誤った形式も表示されます。

System Status Change Date については、次のコードを使用しています。

update [dbo].[SysData] 
Set ["KYC_STATUS_CHANGED_DATE"]= REPLACE(CONVERT(datetime,convert(datetime,left(["KYC_STATUS_CHANGED_DATE"],9),103),106),' ' ,'-')

どちらも何らかのタイプの日付形式に変更されていますが(私の予想される形式ではありません)、テーブル構造ではまだ varchar として表示されています。

ここで何が間違っていますか?

4

2 に答える 2

4

テーブルのデータ型は引き続き varchar です。更新は文字列を変更するだけで、データ型は変更しません。すべきことは次のとおりです (すべての日付が有効で、この形式が 100% 一貫していると仮定します):

UPDATE dbo.SysData SET REGISTRATION_DATE = 
 CONVERT(CHAR(10), CONVERT(DATE, REGISTRATION_DATE, 106), 120);

UPDATE dbo.SysData SET KYC_STATUS_CHANGED_DATE = 
   CONVERT(CHAR(10), CONVERT(DATETIME, LEFT(KYC_STATUS_CHANGED_DATE, 9), 106), 120) 
    + REPLACE(SUBSTRING(KYC_STATUS_CHANGED_DATE, 10, 9), '.',':') 
    + RIGHT(KYC_STATUS_CHANGED_DATE, 2);

ALTER TABLE dbo.SysData ALTER COLUMN REGISTRATION_DATE DATE;
ALTER TABLE dbo.SysData ALTER COLUMN KYC_STATUS_CHANGED_DATE DATETIME;

そして、地域的で潜在的に問題のある文字列の挿入を停止します。日付/日時を表す文字列リテラルは次のようにする必要があります。

-- date only
YYYYMMDD

-- with time:
YYYY-MM-DDThh:mm:ss.nnn

ただし、SQL Server に渡す前に、日付または日時の値であることを確認することをお勧めします。アプリケーションは、任意の文字列形式に変換することなくこれを実行できる必要があります。日付または日時の値を文字列として SQL Server に格納することは決してありません。あなたは何も得ず、かなりのものを失います。

于 2013-10-05T15:52:36.657 に答える
3

varcharとして格納するには、列のデータ型を から に変更する必要がありますDate。次に、それを選択すると、好きなようにフォーマットできます。これを行う 1 つの方法は、正しいデータ型の新しい列を作成し、データを変換してから、古い列を削除することです。古い列に外部キー関係がないことを確認してください。そうしないと、それらも転送する必要があります。

ALTER TABLE [dbo].[SysData] ADD ConvertedDate DateTime
UPDATE [dbo].[SysData] SET ConvertedDate = CAST(VarCharDate as DateTime)
ALTER TABLE [dbo].[SysData] DROP COLUMN VarCharDate
于 2013-10-05T15:55:30.303 に答える