SQLServerのタイムスタンプ列を日時形式に変換する方法


89

SQL Serverはのようなタイムスタンプを返す'Nov 14 2011 03:12:12:947PM'ので、文字列を「Ymd H:i:s」のような日付形式に変換する簡単な方法はありますか。

今のところ使っています

date('Y-m-d H:i:s',strtotime('Nov 14 2011 03:12:12:947PM'))

回答:


251

SQL ServerのTIMESTAMPデータ型は、日付と時刻とは関係ありません

これは、連続する8バイト整数の16進表現にすぎません。これは、行が読み取られてから変更されていないことを確認する場合にのみ役立ちます。

16進整数を読み取るか、必要に応じて読み取ることができますBIGINT。例として:

SELECT CAST (0x0000000017E30D64 AS BIGINT)

結果は

400756068

SQL Serverの新しいバージョンでは、それが呼び出されていますRowVersion-それが実際のところだからです。ROWVERSIONに関するMSDNドキュメントを参照してください。

データベース内で自動的に生成された一意の2進数を公開するデータ型です。rowversionは通常、テーブル行にバージョンスタンプを付けるためのメカニズムとして使用されます。rowversionデータ型は単なる増分数であり、日付や時刻は保持されません。日付または時刻を記録するには、datetime2データ型を使用します。

したがって、SQLServerを日付/時刻に変換することはできませんTIMESTAMP。日付/時刻ではありません。

ただし、タイムスタンプと言っているのに実際にはDATETIME列を意味している場合は、MSDNヘルプのCASTおよびCONVERTトピックで説明されている有効な日付形式のいずれかを使用できます。これらは、SQLServerによって「すぐに」定義およびサポートされます。それ以外はサポートされていません。たとえば、手動でキャストして連結する必要があります(非推奨)。

探しているフォーマットは、ODBCカノニカル(スタイル= 121)に少し似ています

DECLARE @today DATETIME = SYSDATETIME()

SELECT CONVERT(VARCHAR(50), @today, 121)

与える:

2011-11-14 10:29:00.470

SQL Server 2012には、ついにFORMATカスタムフォーマットを実行する機能が追加されます......


5
おそらく、SQLServerでの私の最大のピークです。時刻がわからないのに、なぜタイムスタンプと呼ぶのですか?
BelgoCanadian 2017

1
@BelgoCanadian:Sybaseのを聞いて-永遠のSybase / SQL Serverでをされている機能が.....だこと
marc_s

1
@BelgoCanadianこれがrowversiondocs.microsoft.com/en-us/sql/t-sql/data-types/と呼ばれるようになったことを知ってうれしいはずです
Jason S

あるTIMESTAMP型の列
Ghilterasは、

4

これを行う最も簡単な方法は次のとおりです。

SELECT id,name,FROM_UNIXTIME(registration_date) FROM `tbl_registration`;

これにより、少なくとも日付列が読み取り可能な形式になります。さらに、フォーマットを変更したい場合は、ここをクリックしてください


11
問題はMySQLではなくSQLServerです
Mike M

4

キャストを使用すると、タイムスタンプフィールドから日付を取得できます。

SELECT CAST(timestamp_field AS DATE) FROM tbl_name

18
これは機能していないようです:Explicit conversion from data type timestamp to date is not allowed.
jocull 2017年

悪いアイデア。タイムスタンプフィールドは単なるシーケンスです。運が良ければ日付がわかるかもしれませんが、日付には意味がありません。16進数ではなく10進数が必要な場合は、BIGINTにキャストする必要があります。タイムスタンプは現在、rowversion docs.microsoft.com/en-us/sql/t-sql/data-types/
Jason S

3

私の同僚はこれで私を助けました:

select CONVERT(VARCHAR(10), <tms_column>, 112), count(*)
from table where <tms_column> > '2012-09-10'
group by CONVERT(VARCHAR(10), <tms_column>, 112);

または

select CONVERT(DATE, <tms_column>, 112), count(*)
from table where <tms_column> > '2012-09-10'
group by CONVERT(DATE, <tms_column>, 112);

3

このメッセージを除いて、正常に動作します。

データ型varcharからタイムスタンプへの暗黙的な変換は許可されていません。CONVERT関数を使用して、このクエリを実行します

そうです、TIMESTAMPRowVersion)は日付ではありません:)

正直なところ、私はそれを日付に変換する方法を見つけるためにかなりの時間を自分でいじりました。

最良の方法は、それを変換してINT比較することです。それがこのタイプの意味です。

日付が必要な場合は、Datetime列を追加して、その後も幸せに暮らしましょう:)

乾杯マック


1
または、8バイトなのでBIGINT
Jason S

2

「あなたはその言葉を使い続けます。私はそれがあなたがそれが意味すると思うことを意味するとは思いません。」—イニゴ・モントーヤ

marc_sが最初に言ったように、タイムスタンプは時間とはまったく関係がありません。

declare @Test table (
     TestId int identity(1,1) primary key clustered
    ,Ts     timestamp
    ,CurrentDt datetime default getdate()
    ,Something varchar(max)
)

insert into @Test (Something)
    select name from sys.tables
waitfor delay '00:00:10'

insert into @Test (Something)
    select name from sys.tables

select * from @Test

出力では、Ts(hex)がレコードごとに1ずつ増加しますが、実際の時間には10秒のギャップがあることに注意してください。それが時間に関連している場合、時間の違いに対応するためにタイムスタンプにギャップがあります。


0

タイムスタンプとして整数CONVERT(BIGINT、[timestamp])への変換を実行した後、次のような結果が得られました。

446701117 446701118 446701119 446701120 446701121 446701122 446701123 446701124 446701125 446701126

はい、これは日付と時刻ではありません。シリアル番号です。


0

私にとっては動作します:TO_DATE( '19700101'、 'yyyymmdd')+(TIME / 24/60/60)(oracle DB)


0

タイムスタンプについても同じ問題が発生しました(例:「29-JUL-20 04.46.42.000000000PM」)。'yyyy-MM-dd'形式に変換したかったのです。最終的に私のために働く解決策は

SELECT TO_CHAR(mytimestamp、 'YYYY-MM-DD')FROM mytable;


0

あなたが挿入ステートメントとしてデータダンプを実行し、あなた(またはこれをグーグルで検索した人)が日付と時刻を把握するか、他の場所で使用するために変換しようとしていると仮定します(例:MySQL挿入に変換するため)。これは実際にはどのプログラミング言語でも簡単です。

これで作業しましょう:

CAST(0x0000A61300B1F1EB AS DateTime)

この16進表現は、実際には2つの別個のデータ要素です...日付と時刻。最初の4バイトは日付、次の4バイトは時間です。

  • 日付は0x0000A613です
  • 時間は0x00B1F1EBです

選択したプログラミング言語を使用して、両方のセグメントを整数に変換します(これは、すべての最新のプログラミング言語でサポートされている直接の16進数から整数への変換であるため、プログラミング言語である場合とそうでない場合があるコードでスペースを無駄にしません。あなたが働いている)。

  • 0x0000A613の日付は42515になります
  • 0x00B1F1EBの時刻は11661803になります

さて、それらの整数をどうするか:

日付

日付は1900年1月1日以降で、日数で表されます。したがって、1900年1月1日に42、515日を追加すると、結果は2016年5月27日になります。

時間

時間はもう少し複雑です。そのINTを取得し、次の手順を実行して、真夜中からのマイクロ秒単位の時間を取得します(擬似コード)。

TimeINT=Hex2Int(HexTime)
MicrosecondsTime = TimeINT*10000/3

そこから、言語のお気に入りの関数呼び出しを使用して、マイクロ秒(上記の例では38872676666.7 µs)を時間に変換します。

結果は10:47:52.677になります


-1

それらのいくつかは、実際にはSQL Server2008以降の日時に隠蔽されています。

次のSQLクエリを試してみると、自分で確認できます。

SELECT CAST (0x00009CEF00A25634 AS datetime)

上記の結果になります2009-12-30 09:51:03:000が、実際には日時にマップされないものに遭遇しました。


1
そうしないでください。あなたは幸運になってコンバージョンを得るかもしれませんが、日時は無意味で誤解を招くでしょう。タイムスタンプは単なるシーケンス番号であり、現在は行バージョンdocs.microsoft.com/en-us/sql/t-sql/data-types/…と呼ばれています。10進数が必要な場合はBIGINTにキャストするだけです
Jason S


-3

ここで何かが足りないかどうかはわかりませんが、タイムスタンプを次のように変換することはできません。

CONVERT(VARCHAR,CAST(ZEIT AS DATETIME), 110)

これを試しましたか?TIMESTAMPはDATEとは関係ありません。
ショーンピアス

SQL Server 2008で使用しています
Daniel

繰り返しますが、日時にキャストしようとしないでください。これは、16進形式の単なる整数シーケンスです。BIGINTにキャストするだけです。
ジェイソンS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.