go backarticles

Articles of SQLschool.gr Team

DATETIME and conversion to INT in SQL Server

Fivi Panopoulou - Sotiris Karras

Στην T-SQL, όπως και στις περισσότερες μοντέρνες γλώσσες προγραμματισμού, ο operator ‘+’ είναι overloaded. Αυτό σημαίνει πως όταν τον χρησιμοποιούμε, ανάλογα το datatype των ορισμάτων, αυτός θα μας επιστρέψει και διαφορετικά αποτελέσματα. Για παράδειγμα, όταν τον χρησιμοποιούμε με strings ορίσματα (CHAR ,VARCHAR, NVARCHAR, κ.τ.λ.) θα κάνει concatenation, ενώ όταν τον καλούμε με INTs θα εκτελέσει ακέραια πρόσθεση. Στην σελίδα στο MSDN αναφέρονται και οι τρόποι με τους οποίους συμπεριφέρεται αν τον καλέσουμε με ορίσματα διαφορετικά datatypes (π.χ. INT + CHAR ή INT + DATETIME). Τι θα συμβεί όμως αν τον καλέσουμε με ορίσματα DATETIME; Ή αλλιώς τι αποτέλεσμα θα επιστρέψει το SELECT GETDATE() + GETDATE();

Είναι προφανές ότι η παραπάνω πράξη δεν έχει πρακτικό νόημα, καθώς από την πρόσθεση ημερομηνιών δεν προκύπτει κάποιο λογικό αποτέλεσμα. Αν όμως δώσουμε το παραπάνω query στον SQL Server, αυτός θα μας επιστρέψει αποτέλεσμα, και μάλιστα αυτό θα είναι DATETIME. Σε αυτό το post, θα μελετήσουμε το ποια είναι η σημασία του αποτελέσματος αυτού και το πώς υπολογίζεται.

Αρχικά ας τρέξουμε το παρακάτω query:

SELECT CAST('2016-04-16' AS DATETIME) + CAST('2016-04-17' AS DATETIME) AS UnknownDate;
-- UnknownDate: 2132-08-01 00:00:00.000
Ομοίως, το επόμενο query:


SELECT CONVERT(INT,CAST('2016-04-16' AS DATETIME)) AS ConvDate1, CONVERT(INT,CAST('2016-04-17' AS DATETIME)) AS ConvDate2;
-- ConvDate1: 42474, ConvDate2: 42475
 
Οπότε μετατρέποντας δύο DATETIME πεδία τα οποία έχουν διαφορά μίας ημέρας σε INT μας προκύπτουν δύο ακέραιοι αριθμοί που διαφέρουν και οι αυτοί κατά 1. Υποθέτουμε λοιπόν πως η μετατροπή ενός DATETIME πεδίου σε INT, είναι ο υπολογισμός του αριθμού των ημερών που έχουν περάσει από fixed ημερομηνία. Ο πιο εύκολος τρόπος να την υπολογίσουμε είναι τρέχοντας το παρακάτω, τo οποίο μας επιστρέφει την ημερομηνία “μηδέν”:

SELECT CAST('2016-04-16' AS DATETIME) - CAST('2016-04-16' AS DATETIME) AS ZeroDate;
-- ZeroDate: 1900-01-01 00:00:00.000

Τώρα είμαστε πλέον σε θέση να κατανοήσουμε το αποτέλεσμα του πρώτου query που εκτελέσαμε. Ο SQL Server, υπολόγισε τις ημέρες που έχουν περάσει από την 01/01/1900 για τις δύο ημερομηνίες (42474 και 42475 αντίστοιχα) και στην συνέχεια υπολόγισε την ημερομηνία που θα έχουμε αφού έχουν περάσει 84949 ημέρες από αυτήν. Για του λόγου του αληθές αν τρέξουμε το παρακάτω query

SELECT DATEADD(DAY,42474+42475,'1/1/1900') AS ResolvedDate;

To αποτέλεσμα είναι το ίδιο με αυτό του πρώτου query.

Σημείωση: Το παραπάνω ισχύει για datetime μόνο. Για τα date και datetime2 data types η πράξη θα επιστρέψει σφάλμα.


Fivi Panopoulou

Fivi Panopoulou

System Engineer • Speaker

Το 2007 ξεκίνησα τις σπουδές μου στη σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών στο Εθνικό Μετσόβιο Πολυτεχνείο.Κατά την διάρκεια των σπουδών μου εκεί αγάπησα τον προγραμματισμό και τα συστήματα πληροφορικής, καθώς επίσης απέκτησα το ιδιαίτερο ενδιαφέρον μου για τις βάσεις δεδομένων. Κατά την διάρκεια της διπλωματικής μου ασχολήθηκα με ζητήματα ανωνυμοποίησης δεδομένων και την ανάπτυξη σχετικού εργαλείου. Τα τελευταία χρόνια των σπουδών μου, μου δόθηκε η ευκαιρία να ασχοληθώ περισσότερο και να διευρύνω τους ορίζοντές μου ως Microsoft Student Partner και μέσω της κοινότητας Student Guru. Στα πλαίσια των κοινοτήτων αυτών, ξεκίνησα να ασχολούμαι με παρουσιάσεις αλλά και να γνωρίζω τον SQL Server. Από την πρώτη στιγμή που ασχολήθηκα μαζί του, συνειδητοποίησα πόσο ήθελα να εμβαθύνω τις γνώσεις μου σχετικά με αυτόν και τα συστήματα διαχείρισης βάσεων δεδομένων γενικότερα, πράγμα που προσπαθώ να κάνω έκτοτε. Πριν χρόνια είχα την τύχη να συμμετέχω στο πρόγραμμα mentoring, μέσω του οποίου γνώρισα τον κ. Χατζηπαυλή. Από τότε συμμετέχω στην ομάδα του SQLschool.gr.


Sotiris Karras

Sotiris Karras

System Engineer • Speaker

Είμαι απόφοιτος της σχολής Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών του Εθνικού Μετσόβιου Πολυτεχνείου και στα ενδιαφέροντά μου συμπεριλαμβάνεται o τομέας του Knowledge and Data Engineering. Πιο συγκεκριμένα, έχω ασχοληθεί ακαδημαϊκά και ερευνητικά με τον τομέα του data privacy και data anonymity, ενώ πάθος μου είναι ό,τι έχει να κάνει με relational databases και data management. Στο παρελθόν, έχω συνεργαστεί με την Microsoft Hellas ως Microsoft Student Partner για ακαδημαϊκές δραστηριότητες και ήμουν μέρος του MVP mentoring προγράμματός της, στο οποίο είχα την τύχη να γνωρίσω τον κ. Χατζηπαυλή.


Leave your comment

COMMENT

FULL NAME

EMAIL ADDRESS

We use Gravatar

WEB SITE



captcha


 

Newsletter

If you want to receive updates from us subscribe below with your email.
Follow us in
PASS chapter logo

The Official PASS Local Group for Greece

About us Contact us Terms of Use Privacy Sing in Register
sql school greece logo
© 2010-2020 All rights reserved

This site uses cookies for operational and analytics purposes only. By continuing to browse this site, you agree to their use.