31

Excelの日付シリアル番号日付を含むcsvファイルにDateOfBirthという列があります

例:

  36464
  37104
  35412

私がExcelでセルをフォーマットすると、これらは次のように変換されます

  36464 => 1/11/1999
  37104 => 1/08/2001
  35412 => 13/12/1996

この変換はSSISまたはSQLで行う必要があります。これはどのように達成できますか?

4

14 に答える 14

48

SQLの場合:

select dateadd(d,36464,'1899-12-30')
-- or thanks to rcdmk
select CAST(36464 - 2 as SmallDateTime)

SSISでは、ここを参照してください

http://msdn.microsoft.com/en-us/library/ms141719.aspx

于 2012-12-12T23:56:58.323 に答える
15

マークされた回答が正常に機能していません。日付を「1899-12-31」ではなく「1899-12-30」に変更してください。

select dateadd(d,36464,'1899-12-30')
于 2014-10-01T20:16:28.327 に答える
12

あなたはそれをSQLにキャストすることができますSMALLDATETIME

CAST(36464 - 2 as SMALLDATETIME)

MS SQL Serverは1900年1月1日からの日付をカウントし Excelは1899年12月30日から=2日少ない日付をカウントします。

于 2015-01-08T22:01:01.213 に答える
6

これは実際に私のために働いた

dateadd(mi,CONVERT(numeric(17,5),41869.166666666664)*1440,'1899-12-30') 

(日付のマイナス1日)

否定的なコメントの投稿を参照

于 2014-09-10T06:48:10.570 に答える
4

tldr:

select cast(@Input - 2e as datetime)

説明:

Excelは、20世紀の初めからの経過時間を表す浮動小数点数として日時を格納し、SQLServerは同じ方法で浮動小数点と日時の間で簡単にキャストできます。ExcelとSQLサーバーによるこの数値の日時への変換の違いは2日です(1900-03-01の時点では、つまり)。この違いにのリテラルを使用すると、2eSQL 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
于 2020-01-31T22:36:37.540 に答える
1

このトピックは非常に役立つことがわかったので、そのための簡単な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
于 2015-12-08T16:46:32.903 に答える
1

SSISソリューション

DT_DATEデータ型は、8バイトの浮動小数点数を使用して実装されます。日は、1899年12月30日から始まる整数の増分で表され、真夜中は時間ゼロとして表されます。時間値は、数値の小数部分の絶対値として表されます。ただし、浮動小数点値はすべての実数値を表すことはできません。したがって、DT_DATEで表示できる日付の範囲には制限があります。続きを読む

上記の説明から、これらの値を8バイト浮動小数点数に変換した後、列にマップするときに暗黙的に変換できることがわかりますDT_DATEDT_R8

派生列変換を使用して、この列を8バイトの浮動小数点数に変換します。

(DT_R8)[dateColumn]

DT_DATE次に、それを列にマップします

または、2回キャストします。

(DT_DATE)(DT_R8)[dateColumn]

あなたはここで私の完全な答えをチェックすることができます:

于 2017-06-18T05:29:52.627 に答える
1

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')
              )
于 2018-03-06T17:14:54.677 に答える
0

@ Nick.McDermaidの回答に加えて、このソリューションを投稿したいと思います。このソリューションは、日だけでなく、時間、分、秒も変換します。

SELECT DATEADD(s, (42948.123 - FLOOR(42948.123))*3600*24, dateadd(d, FLOOR(42948.123),'1899-12-30'))

例えば

  • 42948.1232017-08-01 02:57:07.000
  • 42818.71666666672017-03-24 17:12:00.000
于 2017-03-27T12:48:56.527 に答える
0

ビューに日付を表​​示する必要がある場合は、これを行うことができます。

CASTCONVERT大量のデータがある場合よりも高速になります。また、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)

このテストで何をしたいかわからない場合は、再テストしてください。必要に応じて、テーブルのコピーを作成してください。いつでもビューを作成できます!

于 2017-08-10T16:56:23.063 に答える
0

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
 )
于 2018-08-03T13:41:42.690 に答える
0

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

于 2019-07-01T00:39:28.090 に答える
0

Excelでこれを行う方法を探している人(日付フィールドへのフォーマット以外)では、テキスト関数https://exceljet.net/excel-functions/excel-text-functionを使用してこれを行うことができます

すなわち

A1 = 132134
=Text(A1,"MM-DD-YYYY") will result in a date
于 2020-09-25T10:20:34.120 に答える
-3

フィールドが時間部分を取得するための数値であることがあるため、これは私にとってはうまくいきました。

指示:

 dateadd(mi,CONVERT(numeric(17,5),41869.166666666664)*1440,'1899-12-31') 
于 2014-07-28T16:22:43.233 に答える