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 BIGINT
wilt. Als voorbeeld:
SELECT CAST (0x0000000017E30D64 AS BIGINT)
Het resultaat is
400756068
In nieuwere versies van SQL Server wordt het RowVersion
genoemd – 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 TIMESTAMP
dus niet converteren naar een datum/tijd – het is gewoon geen datum/tijd.
Maar als u tijdstempel zegt, maar eigenlijk bedoelt u een Datetime
kolom – 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 INT
en te vergelijken. Daar is dit type voor bedoeld.
Als je een date wilt, voeg dan een kolom Datetime
toe 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:000
maar 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)