web-dev-qa-db-ja.com

SQL Serverのタイムスタンプ列をdatetime形式に変換する方法

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'))
74
Jayson

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

SQL Server 2012には、ついにカスタムフォーマットを行うためのFORMAT関数が入ります .

219
marc_s

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

SELECT CAST(timestamp_field AS DATE) FROM tbl_name
4
Ali

このメッセージを除いて、うまくいきます:

データ型varcharからタイムスタンプへの暗黙の変換はできません。このクエリを実行するには、CONVERT関数を使用してください。

そうです、TIMESTAMPRowVersion)はではなく a DATE :)

正直に言うと、私はそれを日付に変換する方法を見つけるためにかなり時間を費やしました。

最善の方法は、それをINTに変換して比較することです。それこそがこのタイプのものなのです。

あなたが日付が欲しいならば - ちょうどDatetimeカラムを追加して、そしてその後ずっと幸せに生きる:)

歓声マック

3
Mac

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

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
Jadwiga

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

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秒のずれがあります。時間に関連している場合は、時間の差に対応するためにタイムスタンプにギャップがあります。

2
user432532

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

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

これは少なくとも日付列を読みやすいフォーマットで与えます。さらにフォーマットを変更したい場合は こちら をクリックしてください。

1
Sudeep nayak

FROM_UNIXTIME(unix_timestamp, format)を試してみませんか?

1
user3541554

そのうちのいくつかは、実際にはSQL Server 2008以降の日付時刻に変換されます。

次のSQLクエリを試してみてください、あなたはあなた自身のために表示されます。

SELECT CAST (0x00009CEF00A25634 AS datetime)

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

0
ambodi