Hoe de tijdstempelkolom van SQL Server te converteren naar datum/tijd-formaat

Aangezien SQL Server een tijdstempel retourneert zoals 'Nov 14 2011 03:12:12:947PM', is er een eenvoudige manier om strings te converteren naar een datumnotatie zoals ‘Ymd H:i:s’.

Tot nu toe gebruik ik

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

Antwoord 1, autoriteit 100%

Het TIMESTAMP-gegevenstype van SQL Server heeft nietste maken met een datum en tijd!

Het is gewoon een hexadecimale weergave van een opeenvolgend geheel getal van 8 bytes – het is alleen goed om ervoor te zorgen dat een rij niet is gewijzigd sinds deze is gelezen.

Je kunt het hexadecimale gehele getal aflezen of als je een BIGINTwilt. Als voorbeeld:

SELECT CAST (0x0000000017E30D64 AS BIGINT)

Het resultaat is

400756068

In nieuwere versies van SQL Server wordt het RowVersiongenoemd – want dat is het echt. Bekijk de MSDN-documenten op ROWVERSION:

Is een gegevenstype dat automatisch gegenereerde, unieke binaire getallen in een database blootlegt. rowversion wordt over het algemeen gebruikt als een mechanisme
voor versie-stempeltabelrijen. De
rowversion gegevenstype is slechts een oplopend getal en niet
bewaar een datum of een tijd
. Gebruik een datetime2 . om een datum of tijd vast te leggen
gegevenstype.

Je kunteen SQL Server TIMESTAMPdus niet converteren naar een datum/tijd – het is gewoon geen datum/tijd.

Maar als u tijdstempel zegt, maar eigenlijk bedoelt u een Datetimekolom – dan kunt u een van die geldige datumformaten gebruiken die zijn beschreven in de cast en converteer onderwerp in de MSDN-hulp. Die zijn gedefinieerd en ondersteund “out of the box” door SQL Server. Al het andere wordt niet ondersteund, b.v. Je moet veel handmatige gieten en aaneenschrijdend doen (niet aanbevolen).

Het formaat dat u zoekt, ziet er een beetje op, zoals de ODBC Canonical (STYLE = 121):

DECLARE @today DATETIME = SYSDATETIME()
SELECT CONVERT(VARCHAR(50), @today, 121)

geeft:

2011-11-14 10:29:00.470

SQL Server 2012 heeft eindelijk een FORMAT-functie om aangepaste formattering te doen ……


Antwoord 2, Autoriteit 3%

De eenvoudigste manier om dit te doen is:

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

Dit geeft de datumkolom tenminste in een leesbaar formaat.
Verder als u het wilt wijzigen van het formaat wilt klikken op hier .


Antwoord 3

Mijn collega’s hebben me hiermee geholpen:

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

of

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

Antwoord 4

Met cast kun je de datum uit een tijdstempelveld halen:

SELECT CAST(timestamp_field AS DATE) FROM tbl_name

Antwoord 5

Werkt prima, behalve dit bericht:

Impliciete conversie van gegevenstype varchar naar tijdstempel is niet toegestaan. Gebruik de CONVERT-functie om deze zoekopdracht uit te voeren

Dus ja, TIMESTAMP(RowVersion) is NIETeen DATUM 🙂

Om eerlijk te zijn, heb ik zelf een hele tijd zitten prutsen om een manier te vinden om het om te zetten in een datum.

De beste manier is om het te converteren naar INTen te vergelijken. Daar is dit type voor bedoeld.

Als je een date wilt, voeg dan een kolom Datetimetoe en leef nog lang en gelukkig 🙂

proost mac


Antwoord 6

“Je blijft dat woord gebruiken. Ik denk niet dat het betekent wat je denkt dat het betekent.”
— Inigo Montoya

Het tijdstempel heeft absoluut geen relatie met tijd, zoals marc_s oorspronkelijk zei.

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

Kennisgeving in de uitvoer die TS (HEX) doorverhaalt door één voor elke record, maar de werkelijke tijd heeft een opening van 10 seconden. Als het gerelateerd was aan de tijd, zou er een opening in de tijdstempel zijn om overeen te komen met het verschil in de tijd.


Antwoord 7

Na impellen van conversie naar gehele getal
Converteren (Bigint, [Timestamp]) als tijdstempel
Ik heb het resultaat als

446701117
446701118
446701119
446701120
446701121
446701122
446701123
446701124
446701125
446701126

Ja, dit is geen datum en tijd, het zijn serienummers


Antwoord 8

Voor mij werkt:
To_date (‘19700101’, ‘yyyymmdd’) + (Time / 24 / 60/60)
(Oracle db)


Antwoord 9

Sommigen van hen daadwerkelijk bedekt met een datum van SQL Server 2008 .

Probeer de volgende SQL-query en je zult het zelf zien:

SELECT CAST (0x00009CEF00A25634 AS datetime)

Het bovenstaande zal resulteren in 2009-12-30 09:51:03:000maar ik ben ondervonden die eigenlijk niet naar een datummedewerkers plaatsen.


Antwoord 10

Ik had hetzelfde probleem met tijdstempel, bijvoorbeeld: ’29-JUL-20 04.46.42.000000000 PM ‘. Ik wilde het veranderen in ‘YYYY-MM-DD’ -indeling. De oplossing die uiteindelijk voor mij werkt, is

Selecteer To_Char (MyTimestamp, ‘YYYY-MM-DD’) van MyTable;


Antwoord 11

Ik ga ervan uit dat u een gegevensdump hebt gedaan als invoegingsafschriften, en u (of wie dit) probeert om de datum en tijd te achterhalen, of het voor gebruik elders te vertalen (bijv.: Converteren naar MySQL-inzetstukken ). Dit is eigenlijk eenvoudig in een programmeertaal.

Laten we hiermee werken:

CAST(0x0000A61300B1F1EB AS DateTime)

Deze Hex-representatie bestaat eigenlijk uit twee afzonderlijke gegevenselementen… Datum en Tijd. De eerste vier bytes zijn datum, de tweede vier bytes zijn tijd.

  • De datum is 0x0000A613
  • De tijd is 0x00B1F1EB

Converteer beide segmenten naar gehele getallen met behulp van de programmeertaal van uw keuze (het is een directe conversie van hex naar geheel getal, die wordt ondersteund in elke moderne programmeertaal, dus ik zal geen ruimte verspillen met code die al dan niet de programmeertaal waarin u werkt).

  • De datum van 0x0000A613 wordt 42515
  • De tijd van 0x00B1F1EB wordt 11661803

Wat te doen met die gehele getallen:

Datum

Datum is sinds 01/01/1900 en wordt weergegeven als dagen. Dus tel 42.515 dagen op bij 01/01/1900 en je resultaat is 27-05-2016.

Tijd

Tijd is iets ingewikkelder. Neem die INT en doe het volgende om je tijd in microseconden sinds middernacht (pseudocode) te krijgen:

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

Gebruik vanaf daar de favoriete functieaanroepen van uw taal om microseconden (38872676666,7 µs in het bovenstaande voorbeeld) om te zetten in tijd.

Het resultaat zou 10:47:52.677 zijn


Antwoord 12

Waarom probeert u FROM_UNIXTIME(unix_timestamp, format)niet?


Antwoord 13

Ik weet niet zeker of ik hier iets mis, maar kun je de tijdstempel niet gewoon zo converteren:

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

Other episodes