web-dev-qa-db-ja.com

SQL Server 2008でNVARCHARをDATETIMEに変換する

私のテーブルで

_LoginDate  
2013-08-29 13:55:48  
_

loginDate列のデータ型はnvarchar(150)です

SQLコマンドを使用してlogindate列を日時形式に変換したい

期待される結果。

_LoginDate  
29-08-2013 13:55:48
_
5
user2617053
DECLARE @chr nvarchar(50) = (SELECT CONVERT(nvarchar(50), GETDATE(), 103))

SELECT @chr chars, CONVERT(date, @chr, 103) date_again
5
user586399
SELECT CONVERT(NVARCHAR, LoginDate, 105)+' '+CONVERT(NVARCHAR, LoginDate, 108) AS LoginDate FROM YourTable

Output
-------------------
29-08-2013 13:55:48
2
Nisha
alter table your_table
alter column LoginDate datetime;

SQLFiddleデモ

1
juergen d

データはnvarcharであるため、datetimeに変換される保証はありません(無効な日付/時刻情報を保持している可能性があるため)-これを処理する方法は、クロス適用内で使用するISDATEを使用することです。 (クロス適用結果は再利用可能であるため、出力形式の作成が容易になります。)

|                     YOUR_DT |             SQL2008 |
|-----------------------------|---------------------|
|         2013-08-29 13:55:48 | 29-08-2013 13:55:48 |
|    2013-08-29 13:55:48 blah |              (null) |
| 2013-08-29 13:55:48 rubbish |              (null) |

SELECT
  [Your_Dt]
, convert(varchar, ca1.dt_converted ,105) + ' ' + convert(varchar, ca1.dt_converted ,8) AS sql2008
FROM your_table
CROSS apply ( SELECT CASE WHEN isdate([Your_Dt]) = 1
                        THEN convert(datetime,[Your_Dt])
                        ELSE NULL
                     END
            ) AS ca1 (dt_converted)
;

ノート:

また、left([Your_Dt]、19)を導入して、「2013-08-29 13:55:48ゴミ」から「2013-08-29 13:55:48」のような文字列のみを取得することもできます。

その特定の出力については、比較のために2つのSQL 2008日付スタイル(105および8)sql2012を追加する必要があると思います

declare @your_dt as datetime2
set @your_dt = '2013-08-29 13:55:48'

select
  FORMAT(@your_dt, 'dd-MM-yyyy H:m:s') as sql2012
, convert(varchar, @your_dt ,105) + ' ' + convert(varchar, @your_dt ,8) as sql2008

|             SQL2012 |             SQL2008 |
|---------------------|---------------------|
| 29-08-2013 13:55:48 | 29-08-2013 13:55:48 | 
1
Used_By_Already

これはどうですか

--// Convert NVARCHAR to DATETIME
DECLARE @date DATETIME = (SELECT convert(DATETIME, '2013-08-29 13:55:48', 120))
--// Convert DATETIME to custom NVARCHAR FORMAT
SELECT 
RIGHT('00'+ CAST(DAY(@date) AS NVARCHAR),2) + '-' +
RIGHT('00'+ CAST(MONTH(@date) AS NVARCHAR),2) + '-' + 
CAST(YEAR(@date) AS NVARCHAR) + ' ' + 
CAST(CONVERT(TIME,@date) AS NVARCHAR)

結果:'29 -08-2013 13:55:48.0000000 '

0
Muflix

何をしたくないのですか?列のデータ型を変更するには、次のように単純にalterコマンドを使用します。

ALTER TABLE table_name ALTER COLUMN LoginDate DateTime;

ただし、この列にのみ有効な日付があるはずですが、データ型はnvarcharです。

データのフェッチ中にデータ型を変換したくない場合は、CONVERT関数を次のように使用できます。

CONVERT(data_type(length)、expression、style)

例えば:

SELECT CONVERT(DateTime、loginDate、6)

これにより、8月13日29が返されます。アクセスできるCONVERT関数の詳細については、

http://www.w3schools.com/sql/func_convert.asp

DateTime列には常にDataTimeデータ型を使用してください。

ありがとうございました

0
Regon