1. MSSQL日期类型
MSSQL中常见的日期数据类型包括datetime、smalldatetime、date、time、datetime2、datetimeoffset等。每一种日期类型都有其特点和适用场景。在使用时需要根据实际需要选择合适的日期类型。以下是各种日期类型的介绍:
1.1 datetime和smalldatetime类型
datetime类型可以存储从1753年1月1日到9999年12月31日之间的日期和时间,精确到毫秒。smalldatetime类型可以存储从1900年1月1日到2079年6月6日之间的日期和时间,精确到分钟。两种类型都占用8个字节的存储空间。
-- 创建一个存储datetime类型的表
CREATE TABLE mytable (
id INT PRIMARY KEY,
mydatetime DATETIME
)
-- 创建一个存储smalldatetime类型的表
CREATE TABLE mytable (
id INT PRIMARY KEY,
mydatetime SMALLDATETIME
)
1.2 date类型
date类型可以存储从0001年1月1日到9999年12月31日之间的日期,占用3个字节的存储空间。
-- 创建一个存储date类型的表
CREATE TABLE mytable (
id INT PRIMARY KEY,
mydate DATE
)
1.3 time类型
time类型可以存储在一天内的时间,精确到纳秒。占用3~5个字节的存储空间,取决于精度。
-- 创建一个存储time类型的表,精度为2(精确到百万秒)
CREATE TABLE mytable (
id INT PRIMARY KEY,
mytime TIME(2)
)
1.4 datetime2类型
datetime2类型可以存储从0001年1月1日到9999年12月31日之间的日期和时间,精确到纳秒。占用6~8个字节的存储空间,取决于精度。
-- 创建一个存储datetime2类型的表,精度为3(精确到毫秒)
CREATE TABLE mytable (
id INT PRIMARY KEY,
mydatetime2 DATETIME2(3)
)
1.5 datetimeoffset类型
datetimeoffset类型可以存储从0001年1月1日到9999年12月31日之间的日期和时间,精确到100纳秒,同时包含时区信息。占用8~10个字节的存储空间,取决于精度。
-- 创建一个存储datetimeoffset类型的表,精度为4(精确到10毫秒)
CREATE TABLE mytable (
id INT PRIMARY KEY,
mydatetimeoffset DATETIMEOFFSET(4)
)
2. 日期操作
2.1 获取当前日期和时间
可以使用GETDATE()函数获取当前系统日期和时间,该函数返回一个datetime类型的值。
SELECT GETDATE()
2.2 获取日期和时间的部分值
可以使用YEAR、MONTH、DAY、HOUR、MINUTE、SECOND等函数获取日期和时间的部分值。
-- 获取当前年份
SELECT YEAR(GETDATE())
-- 获取当前月份
SELECT MONTH(GETDATE())
-- 获取当前日
SELECT DAY(GETDATE())
-- 获取当前小时
SELECT DATEPART(HOUR, GETDATE())
-- 获取当前分钟
SELECT DATEPART(MINUTE, GETDATE())
-- 获取当前秒数
SELECT DATEPART(SECOND, GETDATE())
2.3 计算日期之间的间隔
可以使用DATEDIFF函数计算两个日期之间的间隔,可用的时间单位包括年、季度、月、日、周、小时、分钟、秒、毫秒等。
-- 计算两个日期相差的天数
SELECT DATEDIFF(DAY, '2022-10-01', '2022-10-31')
-- 计算两个时间之间相差的秒数
SELECT DATEDIFF(SECOND, '2022-10-01 10:00:00', '2022-10-01 11:00:30')
2.4 转换日期和时间数据类型
可以使用CONVERT函数和CAST函数将日期和时间数据类型转换为其他类型。CONVERT函数还可以将日期和时间格式化为指定的字符串格式。
-- 将datetime类型转换为date类型
SELECT CAST('2022-10-01 10:00:00' AS DATE)
-- 将date类型转换为字符串类型
SELECT CONVERT(VARCHAR(10), '2022-10-01', 120)
-- 将字符串类型转换为datetime类型
SELECT CONVERT(DATETIME, '2022-10-01 10:00:00', 120)
3. 示例
假设我们有一个订单表orders,其中包含订单号、订单日期、付款日期、送货日期等字段。我们需要统计每个订单的订单周期(即从订单日期到付款日期的时间间隔)和送货周期(即从付款日期到送货日期的时间间隔)。
首先创建表orders,并插入一些数据:
-- 创建表orders
CREATE TABLE orders (
order_id INT PRIMARY KEY,
order_date DATETIME,
payment_date DATETIME,
delivery_date DATETIME
)
-- 插入数据
INSERT INTO orders VALUES
(1, '2022-01-01 10:00:00', '2022-01-03 10:00:00', '2022-01-05 10:00:00'),
(2, '2022-02-01 10:00:00', '2022-02-03 10:00:00', '2022-02-05 10:00:00'),
(3, '2022-03-01 10:00:00', '2022-03-03 10:00:00', '2022-03-05 10:00:00')
然后使用DATEDIFF函数计算两个日期之间的间隔:
-- 计算订单周期
SELECT order_id,
DATEDIFF(DAY, order_date, payment_date) AS order_cycle,
DATEDIFF(DAY, payment_date, delivery_date) AS delivery_cycle
FROM orders
最后得到的结果如下:
+----------+-------------+----------------+
| order_id | order_cycle | delivery_cycle |
+----------+-------------+----------------+
| 1 | 2 | 2 |
| 2 | 2 | 2 |
| 3 | 2 | 2 |
+----------+-------------+----------------+
4. 总结
MSSQL中提供了多种日期类型和操作函数,可以满足不同场景下的需求。在使用时需要根据实际需要选择合适的日期类型,并使用相应的函数进行操作。