SQL Serverは'Nov 14 2011 03:12:12:947PM'
のようなタイムスタンプを返すので、文字列を 'Y-m-d H:i:s'のような日付形式に変換する簡単な方法があります。
今のところ私が使っている
date('Y-m-d H:i:s',strtotime('Nov 14 2011 03:12:12:947PM'))
SQL ServerのTIMESTAMP
データ型には、日付と時刻に関係するnothingがあります。
これは、連続した8バイトの整数を16進数で表現したものです - 読み取られてから行が変更されていないことを確認するのに役立ちます。
16進整数を読み取ることも、BIGINT
が必要な場合は読み取ることもできます。例として:
SELECT CAST (0x0000000017E30D64 AS BIGINT)
結果は
400756068
SQL Serverの新しいバージョンでは、それはRowVersion
と呼ばれています。 ROWVERSIONに関するMSDNのドキュメント を参照してください。
データベース内で自動的に生成された一意の2進数を公開するデータ型です。 rowversionは一般的に、テーブル行のバージョンスタンプのメカニズムとして使用されます。 rowversionデータ型は単なる増加数であり、日付または時刻を保持しないです。日付または時刻を記録するには、datetime2データ型を使用します
そのため、SQL ServerのTIMESTAMP
を日付/時刻にcannot変換します - これは単に日付/時刻ではありません。
しかし、タイムスタンプを言っていても、実際にはDATETIME
列を意味している場合は、MSDNヘルプの CASTおよびCONVERT トピックに記載されている有効な日付形式を使用できます。それらは、SQL Serverによって「そのまま」定義およびサポートされています。それ以外はサポートされていません。手動のキャストと連結をたくさんする必要があります(お勧めできません)。
探している形式は、ODBC正規(style = 121)に少し似ています。
DECLARE @today DATETIME = SYSDATETIME()
SELECT CONVERT(VARCHAR(50), @today, 121)
を与えます:
2011-11-14 10:29:00.470
キャストを使用すると、タイムスタンプフィールドから日付を取得できます。
SELECT CAST(timestamp_field AS DATE) FROM tbl_name
このメッセージを除いて、うまくいきます:
データ型varcharからタイムスタンプへの暗黙の変換はできません。このクエリを実行するには、CONVERT関数を使用してください。
そうです、TIMESTAMP
(RowVersion
)はではなく a DATE :)
正直に言うと、私はそれを日付に変換する方法を見つけるためにかなり時間を費やしました。
最善の方法は、それをINT
に変換して比較することです。それこそがこのタイプのものなのです。
あなたが日付が欲しいならば - ちょうどDatetime
カラムを追加して、そしてその後ずっと幸せに生きる:)
歓声マック
私の同僚はこれで私を助けました:
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);
「あなたはその言葉を使い続けます。私はそれがあなたがそれが意味すると思うことを意味するとは思いません。」 - イニゴモントーヤ
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秒のずれがあります。時間に関連している場合は、時間の差に対応するためにタイムスタンプにギャップがあります。
これを行う最も簡単な方法は次のとおりです。
SELECT id,name,FROM_UNIXTIME(registration_date) FROM `tbl_registration`;
これは少なくとも日付列を読みやすいフォーマットで与えます。さらにフォーマットを変更したい場合は こちら をクリックしてください。
FROM_UNIXTIME(unix_timestamp, format)
を試してみませんか?
そのうちのいくつかは、実際にはSQL Server 2008以降の日付時刻に変換されます。
次のSQLクエリを試してみてください、あなたはあなた自身のために表示されます。
SELECT CAST (0x00009CEF00A25634 AS datetime)
上記の結果は2009-12-30 09:51:03:000
になりますが、実際には日時にマップされないものに遭遇しました。