2

FLOAT次のような日付のフィールドがあります。

+-----------+
| FloatDate |
+-----------+
| 1012013   | -- Jan 1
| 3262013   | -- Mar 26
| 11072013  | -- Nov 7
| 10012013  | -- Oct 1
+-----------+

このデータを別のテーブルに挿入したいのですが、そのdateFieldのデータ型はDATETIME.

だから、私は FloatDate 値を DATETIME に変換しようとしていますが、失敗し続けています..

私はもう試した

INSERT INTO NEWTABLE 
(DateTimeDate)
SELECT CONVERT(DATETIME, CAST(CAST(FloatDate AS INTEGER) AS CHAR), 112)
FROM OLDTABLE

しかし、これは私に言うエラーを与えます

文字列から日時を変換する際に変換に失敗しました

FloatDateの日付形式がYYYYMMDDであれば動作するようです。だから、私がこれを行うと、うまくいきます。

DECLARE @test FLOAT
SET @test = 2132013                                                                                                                            
SELECT @test,  CONVERT(DATETIME, CAST(RIGHT(CAST(@test AS INTEGER), 4) AS CHAR(4)) + 
CASE WHEN LEN(CAST(@test AS INTEGER)) = 7 THEN '0' + CAST(LEFT(CAST(@test AS INTEGER), 3) AS CHAR(3))
     WHEN LEN(CAST(@test AS INTEGER)) = 8 THEN CAST(LEFT(CAST(@test AS INTEGER), 4) AS CHAR(4)) END, 1)

しかし、これを複雑にしすぎて、より単純な解決策を見逃しているだけなのか、それともこれが私が達成できる唯一の方法なのか疑問に思っています??

4

4 に答える 4

7

次のような他の値があると仮定します。

 3092013 -- March 9th
10052013 -- October 5th
 1112013 -- January 11th
11012013 -- November 1st

次に、これを行うことができます:

DECLARE @x TABLE(FloatDate FLOAT);

INSERT @x VALUES
( 3092013),-- -- March 9th
(10052013),-- -- October 5th
( 1112013),-- -- January 11th
(11012013);-- -- November 1st

;WITH s(d) AS (SELECT RIGHT('0' + CONVERT(VARCHAR(32), 
  CONVERT(INT, FloatDate)), 8) FROM @x),
d(d) AS (SELECT CONVERT(DATETIME, 
  RIGHT(d,4) + LEFT(d,2) + SUBSTRING(d,3,2)) FROM s)
SELECT d FROM d;

結果:

d
-----------------------
2013-03-09 00:00:00.000
2013-10-05 00:00:00.000
2013-01-11 00:00:00.000
2013-11-01 00:00:00.000

あなたの例では、次のようになります。

;WITH s(d) AS (SELECT RIGHT('0' + CONVERT(VARCHAR(32), 
  CONVERT(INT, FloatDate)), 8) FROM dbo.OLDTABLE),
d(d) AS (SELECT CONVERT(DATETIME, 
  RIGHT(d,4) + LEFT(d,2) + SUBSTRING(d,3,2)) FROM s)
INSERT dbo.NEWTABLE
SELECT d FROM d;

もちろん、有効な値の正しい構文を取得したとしても、そこに悪いデータが含まれている可能性があります。使用FLOATしたため、固有の検証は得られないため、その列にはまたはなどが含まれる可能性があり-999ます45671213.

これは痛いと思いますか?良い!痛いはずです。日付を列に保存することに決めた人に戻ってFLOAT、すねを蹴る必要があります。地理データ型を使用して給与を保存しているかどうかを尋ねます。これを修正してくれてうれしいですが、そのような人々はデータベース設計の近くで許可されるべきではありません.

最後に、これをしないでください:

CAST(anything AS CHAR)

必ず長さを指定してください。理由は次のとおりです。

于 2013-03-28T00:38:09.307 に答える
4

8 桁の数字 (float) がある場合は、これを実行できます。

select cast(cast(cast([invoice date] as int) as varchar(8)) as datetime)
于 2014-03-12T01:39:19.743 に答える
2
print (convert(float, CAST('1900-01-01 03:30' AS DATETIME)))--days 0,145833333333333
print (convert(float, CAST('1900-01-01 03:30' AS DATETIME))*24)--hours 3,5
print (convert(float, CAST('1900-01-01 03:30' AS DATETIME))*24*60)--minutes 210
print (convert(float, CAST('1900-01-01 03:30' AS DATETIME))*24*60*60)--seconds 12600

この2番目の方法はよりクリーンです

print (CAST(CAST('1900-01-01 03:30' AS DATETIME) AS FLOAT))--days 0,145833333333333
print (CAST(CAST('1900-01-01 03:30' AS DATETIME) AS FLOAT)*24)--hours 3,5
print (CAST(CAST('1900-01-01 03:30' AS DATETIME) AS FLOAT)*24*60)--minutes 210
print (CAST(CAST('1900-01-01 03:30' AS DATETIME) AS FLOAT)*24*60*60)--seconds 12600
于 2015-12-02T14:12:47.413 に答える