Typ danych SQL Server nie TIMESTAMP
ma nic wspólnego z datą i godziną!
Jest to po prostu szesnastkowa reprezentacja kolejnej 8-bajtowej liczby całkowitej - jest to dobre tylko do upewnienia się, że wiersz nie zmienił się od czasu odczytania.
Możesz odczytać szesnastkową liczbę całkowitą lub jeśli chcesz BIGINT
. Jako przykład:
SELECT CAST (0x0000000017E30D64 AS BIGINT)
Wynik to
400756068
W nowszych wersjach SQL Server nazywa się to RowVersion
- ponieważ tak naprawdę jest. Zobacz dokumentację MSDN na ROWVERSION :
To typ danych, który ujawnia automatycznie generowane, unikalne liczby binarne w bazie danych. wierszversion jest zwykle używany jako mechanizm dla wierszy tabeli znakowania wersji. Typ danych rowversion to tylko rosnąca liczba i nie zachowuje daty ani godziny . Aby zarejestrować datę lub godzinę, użyj typu danych datetime2.
Nie można więc przekonwertować SQL Server TIMESTAMP
na datę / godzinę - to po prostu nie jest data / godzina.
Ale jeśli mówisz o sygnaturze czasowej, ale tak naprawdę masz na myśli DATETIME
kolumnę - możesz użyć dowolnego z tych prawidłowych formatów daty opisanych w temacie RZUTUJ i KONWERTUJ w pomocy MSDN. Są one definiowane i obsługiwane „po wyjęciu z pudełka” przez SQL Server. Wszystko inne nie jest obsługiwane, np. Musisz wykonać dużo ręcznego rzutowania i łączenia (niezalecane).
Format, którego szukasz, wygląda trochę jak kanoniczny ODBC (style = 121):
DECLARE @today DATETIME = SYSDATETIME()
SELECT CONVERT(VARCHAR(50), @today, 121)
daje:
2011-11-14 10:29:00.470
SQL Server 2012 będzie wreszcie miał FORMAT
funkcję niestandardowego formatowania ......
TIMESTAMP
kolumny typuNajprostszym sposobem na to jest:
SELECT id,name,FROM_UNIXTIME(registration_date) FROM `tbl_registration`;
Dzięki temu kolumna z datą jest przynajmniej w czytelnym formacie. Jeśli chcesz zmienić format, kliknij tutaj .
źródło
Korzystając z przesyłania, możesz pobrać datę z pola znacznika czasu:
SELECT CAST(timestamp_field AS DATE) FROM tbl_name
źródło
Explicit conversion from data type timestamp to date is not allowed.
Moi współpracownicy pomogli mi w tym:
select CONVERT(VARCHAR(10), <tms_column>, 112), count(*) from table where <tms_column> > '2012-09-10' group by CONVERT(VARCHAR(10), <tms_column>, 112);
lub
select CONVERT(DATE, <tms_column>, 112), count(*) from table where <tms_column> > '2012-09-10' group by CONVERT(DATE, <tms_column>, 112);
źródło
Działa dobrze, z wyjątkiem tej wiadomości:
Więc tak,
TIMESTAMP
(RowVersion
) NIE jest DATĄ :)Szczerze mówiąc, sam przez jakiś czas majstrowałem, żeby znaleźć sposób na przekształcenie tego w randkę.
Najlepszym sposobem jest przekonwertowanie go
INT
i porównanie. Taki ma być ten typ.Jeśli chcesz randkę - po prostu dodaj
Datetime
kolumnę i żyj długo i szczęśliwie :)okrzyki mac
źródło
- Ciągle używasz tego słowa. Nie sądzę, żeby znaczyło to, co myślisz. - Inigo Montoya
Znacznik czasu nie ma absolutnie żadnego związku z czasem, jak pierwotnie powiedział 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
Zwróć uwagę na wynik, że Ts (hex) zwiększa się o jeden dla każdego rekordu, ale rzeczywisty czas ma przerwę 10 sekund. Gdyby odnosiło się to do czasu, w sygnaturze czasowej byłaby luka odpowiadająca różnicy czasu.
źródło
Po zainicjowaniu konwersji na liczbę całkowitą CONVERT (BIGINT, [timestamp]) jako znacznik czasu otrzymałem wynik taki jak
Tak, to nie jest data i godzina, to numery seryjne
źródło
dla mnie działa: TO_DATE ('19700101', 'yyyymmdd') + (TIME / 24/60/60) (oracle DB)
źródło
Miałem ten sam problem ze znacznikiem czasu, np .: „29 -JUL-20 04.46.42.000000000 PM”. Chciałem przekształcić go w format „yyyy-MM-dd”. Rozwiązanie, które w końcu działa dla mnie, to
SELECT TO_CHAR (mytimestamp, 'YYYY-MM-DD') FROM mytable;
źródło
Zakładam, że wykonałeś zrzut danych jako instrukcje wstawiania, a ty (lub ktokolwiek to szuka w Google), próbujesz znaleźć datę i godzinę lub przetłumaczyć je do użytku w innym miejscu (np .: aby przekonwertować na wstawki MySQL). Jest to rzeczywiście łatwe w każdym języku programowania.
Pracujmy z tym:
CAST(0x0000A61300B1F1EB AS DateTime)
Ta reprezentacja szesnastkowa to w rzeczywistości dwa oddzielne elementy danych ... Data i godzina. Pierwsze cztery bajty to data, drugie cztery bajty to czas.
Zamień oba segmenty na liczby całkowite przy użyciu wybranego języka programowania (jest to bezpośrednia konwersja szesnastkowa na liczbę całkowitą, która jest obsługiwana w każdym nowoczesnym języku programowania, więc nie będę marnował miejsca na kod, który może być językiem programowania lub nie w którym pracujesz).
A teraz co zrobić z tymi liczbami całkowitymi:
Data
Data przypada od 01/01/1900 i jest reprezentowana jako dni. Więc dodaj 42,515 dni do 01.01.1900, a Twój wynik to 27.05.2016.
Czas
Czas jest trochę bardziej złożony. Weź tę INT i wykonaj następujące czynności, aby uzyskać czas w mikrosekundach od północy (pseudokod):
Następnie użyj ulubionych wywołań funkcji swojego języka, aby przetłumaczyć mikrosekundy (38872676666,7 µs w powyższym przykładzie) na czas.
Wynik byłby 10: 47: 52,677
źródło
Niektóre z nich faktycznie ukrywają datę od SQL Server 2008 r.
Wypróbuj następujące zapytanie SQL, a sam się przekonasz:
SELECT CAST (0x00009CEF00A25634 AS datetime)
Powyższe spowoduje,
2009-12-30 09:51:03:000
ale napotkałem takie, które w rzeczywistości nie są mapowane na datę i godzinę.źródło
Dlaczego nie spróbować
FROM_UNIXTIME(unix_timestamp, format)
?źródło
Nie jestem pewien, czy coś mi tu brakuje, ale czy nie możesz po prostu przekonwertować znacznika czasu w ten sposób:
źródło