sql >> Database >  >> RDS >> Sqlserver

Converteer 'time' naar 'smalldatetime' in SQL Server (T-SQL-voorbeelden)

Dit artikel bevat voorbeelden van het converteren van een tijd waarde toe aan een smalldatetime waarde in SQL Server.

Wanneer u een tijd . omrekent waarde voor smalldatetime , de datum is ingesteld op '1900-01-01' en de uur- en minutenwaarden worden naar boven afgerond. De seconden en fractionele seconden zijn ingesteld op 0.

Voorbeeld 1 – Expliciete conversie met CAST()

Hier is een voorbeeld van een expliciete conversie. In dit geval gebruik ik de CAST() functie direct binnen de SELECT statement om expliciet te converteren van tijd naar smalldatetime .

DECLARE @thetime time;
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS smalldatetime) AS 'smalldatetime';

Resultaat:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1900-01-01 23:16:00 |
+------------------+---------------------+

Dus een datumgedeelte wordt toegevoegd en ingesteld op '1900-01-01', en in dit geval worden de minutenwaarden naar boven afgerond en de seconden op 0.

In de Microsoft-documentatie staat dat de fractionele seconden ook op nul staan, maar de smalldatetime gegevenstype omvat sowieso geen fractionele seconden.

Trouwens, wanneer je de smalldatetime . gebruikt datatype, de secondencomponent is altijd ingesteld op 0.

Voorbeeld 2 – Het uur naar boven afronden

Hier is een voorbeeld van het uur dat naar boven wordt afgerond:

DECLARE @thetime time(0);
SET @thetime = '10:59:59';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS smalldatetime) AS 'smalldatetime';

Resultaat:

+----------+---------------------+
| time     | smalldatetime       |
|----------+---------------------|
| 10:59:59 | 1900-01-01 11:00:00 |
+----------+---------------------+

In dit geval heb ik ook een schaal van 0 opgegeven voor de tijdswaarde, maar dit heeft geen invloed op de uitkomst.

Voor alle duidelijkheid:schaal is het aantal cijfers rechts van de komma in een getal. Precisie is het totale aantal cijfers in het getal. Als we een schaal van 0 specificeren, betekent dit dat het fractionele deel niet is inbegrepen.

Voorbeeld 3 – Expliciete conversie met CONVERT()

Hier is een voorbeeld met de CONVERT() functie in plaats van CAST() .

DECLARE @thetime time;
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CONVERT(smalldatetime, @thetime) AS 'smalldatetime';

Resultaat:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1900-01-01 23:16:00 |
+------------------+---------------------+

Voorbeeld 4 – Impliciete conversie

Hier is een voorbeeld van hetzelfde doen, maar met een impliciete typeconversie.

DECLARE @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Resultaat:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1900-01-01 23:16:00 |
+------------------+---------------------+

We krijgen dus hetzelfde resultaat, of het nu een expliciete of impliciete conversie is.

Dit is een impliciete conversie omdat we geen conversiefunctie gebruiken om deze expliciet te converteren. We wijzen eenvoudigweg de waarde van een variabele van het ene gegevenstype toe aan een variabele van een ander gegevenstype. In dit geval voert SQL Server achter de schermen een impliciete conversie uit wanneer we proberen de tijd toe te wijzen waarde toe aan een smalldatetime variabel.

Voorbeeld 5 – Wijzig de datum

Als u de datum wilt wijzigen (maar dezelfde tijd aanhoudt), kunt u de DATEADD() gebruiken functie.

DECLARE @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SET @thesmalldatetime = DATEADD(year, 85, @thesmalldatetime);
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Resultaat:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1985-01-01 23:16:00 |
+------------------+---------------------+

In dit geval tel ik 85 op bij de jaarwaarde, wat het op 1985 brengt.

Houd er echter rekening mee dat smalldatetime ondersteunt een zeer smal datumbereik (1900-01-01 tot 2079-06-06), dus te veel toevoegen aan het jaar kan resulteren in een overloopfout zoals hieronder:

DECLARE @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SET @thesmalldatetime = DATEADD(year, 220, @thesmalldatetime);
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Resultaat:

Adding a value to a 'smalldatetime' column caused an overflow.

  1. Hoe u de huidige datum en tijd in MySQL kunt krijgen

  2. Wat is database-sharding?

  3. Django:Tafel bestaat niet

  4. HHVM gebruiken met WordPress