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'))
回答:
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
カスタムフォーマットを実行する機能が追加されます......
TIMESTAMP
型の列
キャストを使用すると、タイムスタンプフィールドから日付を取得できます。
SELECT CAST(timestamp_field AS DATE) FROM tbl_name
Explicit conversion from data type timestamp to date is not allowed.
私の同僚はこれで私を助けました:
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);
このメッセージを除いて、正常に動作します。
データ型varcharからタイムスタンプへの暗黙的な変換は許可されていません。CONVERT関数を使用して、このクエリを実行します
そうです、TIMESTAMP
(RowVersion
)は日付ではありません:)
正直なところ、私はそれを日付に変換する方法を見つけるためにかなりの時間を自分でいじりました。
最良の方法は、それを変換してINT
比較することです。それがこのタイプの意味です。
日付が必要な場合は、Datetime
列を追加して、その後も幸せに暮らしましょう:)
乾杯マック
「あなたはその言葉を使い続けます。私はそれがあなたがそれが意味すると思うことを意味するとは思いません。」—イニゴ・モントーヤ
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秒のギャップがあることに注意してください。それが時間に関連している場合、時間の違いに対応するためにタイムスタンプにギャップがあります。
タイムスタンプとして整数CONVERT(BIGINT、[timestamp])への変換を実行した後、次のような結果が得られました。
446701117 446701118 446701119 446701120 446701121 446701122 446701123 446701124 446701125 446701126
はい、これは日付と時刻ではありません。シリアル番号です。
私にとっては動作します:TO_DATE( '19700101'、 'yyyymmdd')+(TIME / 24/60/60)(oracle DB)
あなたが挿入ステートメントとしてデータダンプを実行し、あなた(またはこれをグーグルで検索した人)が日付と時刻を把握するか、他の場所で使用するために変換しようとしていると仮定します(例:MySQL挿入に変換するため)。これは実際にはどのプログラミング言語でも簡単です。
これで作業しましょう:
CAST(0x0000A61300B1F1EB AS DateTime)
この16進表現は、実際には2つの別個のデータ要素です...日付と時刻。最初の4バイトは日付、次の4バイトは時間です。
選択したプログラミング言語を使用して、両方のセグメントを整数に変換します(これは、すべての最新のプログラミング言語でサポートされている直接の16進数から整数への変換であるため、プログラミング言語である場合とそうでない場合があるコードでスペースを無駄にしません。あなたが働いている)。
さて、それらの整数をどうするか:
日付
日付は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になります
それらのいくつかは、実際にはSQL Server2008以降の日時に隠蔽されています。
次のSQLクエリを試してみると、自分で確認できます。
SELECT CAST (0x00009CEF00A25634 AS datetime)
上記の結果になります2009-12-30 09:51:03:000
が、実際には日時にマップされないものに遭遇しました。
FROM_UNIXTIME(unix_timestamp, format)
やってみませんか?