Excelの日付シリアル番号日付を含むcsvファイルにDateOfBirthという列があります
例:
36464
37104
35412
私がExcelでセルをフォーマットすると、これらは次のように変換されます
36464 => 1/11/1999
37104 => 1/08/2001
35412 => 13/12/1996
この変換はSSISまたはSQLで行う必要があります。これはどのように達成できますか?
Excelの日付シリアル番号日付を含むcsvファイルにDateOfBirthという列があります
例:
36464
37104
35412
私がExcelでセルをフォーマットすると、これらは次のように変換されます
36464 => 1/11/1999
37104 => 1/08/2001
35412 => 13/12/1996
この変換はSSISまたはSQLで行う必要があります。これはどのように達成できますか?
SQLの場合:
select dateadd(d,36464,'1899-12-30')
-- or thanks to rcdmk
select CAST(36464 - 2 as SmallDateTime)
SSISでは、ここを参照してください
マークされた回答が正常に機能していません。日付を「1899-12-31」ではなく「1899-12-30」に変更してください。
select dateadd(d,36464,'1899-12-30')
あなたはそれをSQLにキャストすることができますSMALLDATETIME
:
CAST(36464 - 2 as SMALLDATETIME)
MS SQL Serverは1900年1月1日からの日付をカウントし、 Excelは1899年12月30日から=2日少ない日付をカウントします。
これは実際に私のために働いた
dateadd(mi,CONVERT(numeric(17,5),41869.166666666664)*1440,'1899-12-30')
(日付のマイナス1日)
否定的なコメントの投稿を参照
tldr:
select cast(@Input - 2e as datetime)
説明:
Excelは、20世紀の初めからの経過時間を表す浮動小数点数として日時を格納し、SQLServerは同じ方法で浮動小数点と日時の間で簡単にキャストできます。ExcelとSQLサーバーによるこの数値の日時への変換の違いは2日です(1900-03-01の時点では、つまり)。この違いにのリテラルを使用すると、2e
SQL Serverは、他のデータ型をfloatに暗黙的に変換して、非常に入力しやすく単純なクエリを実行できるようになります。
select
cast('43861.875433912' - 2e as datetime) as ExcelToSql, -- even varchar works!
cast(cast('2020-01-31 21:00:37.490' as datetime) + 2e as float) as SqlToExcel
-- Results:
-- ExcelToSql SqlToExcel
-- 2020-01-31 21:00:37.490 43861.875433912
このトピックは非常に役立つことがわかったので、そのための簡単なSQLUDFを作成しました。
CREATE FUNCTION dbo.ConvertExcelSerialDateToSQL
(
@serial INT
)
RETURNS DATETIME
AS
BEGIN
DECLARE @dt AS DATETIME
SELECT @dt =
CASE
WHEN @serial is not null THEN CAST(@serial - 2 AS DATETIME)
ELSE NULL
END
RETURN @dt
END
GO
DT_DATEデータ型は、8バイトの浮動小数点数を使用して実装されます。日は、1899年12月30日から始まる整数の増分で表され、真夜中は時間ゼロとして表されます。時間値は、数値の小数部分の絶対値として表されます。ただし、浮動小数点値はすべての実数値を表すことはできません。したがって、DT_DATEで表示できる日付の範囲には制限があります。続きを読む
上記の説明から、これらの値を8バイト浮動小数点数に変換した後、列にマップするときに暗黙的に変換できることがわかります。DT_DATE
DT_R8
派生列変換を使用して、この列を8バイトの浮動小数点数に変換します。
(DT_R8)[dateColumn]
DT_DATE
次に、それを列にマップします
または、2回キャストします。
(DT_DATE)(DT_R8)[dateColumn]
あなたはここで私の完全な答えをチェックすることができます:
Excelの日付にも時間があったため、これを次のレベルに引き上げる必要がありました。そのため、次のような値がありました。
42039.46406 --> 02/04/2015 11:08 AM
42002.37709 --> 12/29/2014 09:03 AM
42032.61869 --> 01/28/2015 02:50 PM
(また、もう少し複雑にするために、10進数の数値はNVARCHARとして保存されました)
この変換を行うために使用したSQLは次のとおりです。
SELECT DATEADD(SECOND, (
CONVERT(FLOAT, t.ColumnName) -
FLOOR(CONVERT(FLOAT, t.ColumnName))
) * 86400,
DATEADD(DAY, CONVERT(FLOAT, t.ColumnName), '1899-12-30')
)
@ Nick.McDermaidの回答に加えて、このソリューションを投稿したいと思います。このソリューションは、日だけでなく、時間、分、秒も変換します。
SELECT DATEADD(s, (42948.123 - FLOOR(42948.123))*3600*24, dateadd(d, FLOOR(42948.123),'1899-12-30'))
例えば
42948.123
に2017-08-01 02:57:07.000
42818.7166666667
に2017-03-24 17:12:00.000
ビューに日付を表示する必要がある場合は、これを行うことができます。
CAST
CONVERT
大量のデータがある場合よりも高速になります。また、Excelの日付から(2)を引くことを忘れないでください。
CAST(CAST(CAST([Column_With_Date]-2 AS INT)AS smalldatetime) AS DATE)
日付を表示するために列を更新する必要がある場合は、結合(必要に応じて自己結合)を介して更新するか、単に次のことを試してください。
Excelの日付をINTとしてキャストする必要はないかもしれませんが、使用していたテーブルはvarcharであったため、最初にその操作を行う必要がありました。また、「time」要素が必要なかったため、最終キャストを「date」としてその要素を削除する必要がありました。
UPDATE [Table_with_Date]
SET [Column_With_Excel_Date] = CAST(CAST(CAST([Column_With_Excel_Date]-2 AS INT)AS smalldatetime) AS DATE)
このテストで何をしたいかわからない場合は、再テストしてください。必要に応じて、テーブルのコピーを作成してください。いつでもビューを作成できます!
GoogleBigQueryソリューション
標準SQL
Select Date, DATETIME_ADD(DATETIME(xy, xm, xd, 0, 0, 0), INTERVAL xonlyseconds SECOND) xaxsa
from (
Select Date, EXTRACT(YEAR FROM xonlydate) xy, EXTRACT(MONTH FROM xonlydate) xm, EXTRACT(DAY FROM xonlydate) xd, xonlyseconds
From (
Select Date
, DATE_ADD(DATE '1899-12-30', INTERVAL cast(FLOOR(cast(Date as FLOAT64)) as INT64) DAY ) xonlydate
, cast(FLOOR( ( cast(Date as FLOAT64) - cast(FLOOR( cast(Date as FLOAT64)) as INT64) ) * 86400 ) as INT64) xonlyseconds
FROM (Select '43168.682974537034' Date) -- 09.03.2018 16:23:28
) xx1
)
postgresqlでは、次の構文を使用できます。
SELECT ((DATE('1899-12-30') + INTERVAL '1 day' * FLOOR(38242.7711805556)) + (INTERVAL '1 sec' * (38242.7711805556 - FLOOR(38242.7711805556)) * 3600 * 24)) as date
この場合、Excel形式で38242.7711805556
表します2004-09-12 18:30:30
Excelでこれを行う方法を探している人(日付フィールドへのフォーマット以外)では、テキスト関数https://exceljet.net/excel-functions/excel-text-functionを使用してこれを行うことができます
すなわち
A1 = 132134
=Text(A1,"MM-DD-YYYY") will result in a date
フィールドが時間部分を取得するための数値であることがあるため、これは私にとってはうまくいきました。
指示:
dateadd(mi,CONVERT(numeric(17,5),41869.166666666664)*1440,'1899-12-31')