sql – 在数据库中存储部分日期

前端之家收集整理的这篇文章主要介绍了sql – 在数据库中存储部分日期前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在关系数据库( MySQL,Postgresql等)中存储部分日期.例如,输入可能只是年份(2013年);年和月(2013-08);或年,月,日(2013-08-29).我不能只使用正常的DATE类型,因为年份将扩展到2013-01-01,这与年,月和日无法区分.

我想到要么将日期分成三个单独的字段(年,日作为整数),但我在DBS中丢失所有日期细节并且必须管理更多的指标.

我的另一个想法是将它存储为DATE,并有另一个专栏说明日期是多么精确.例如,’2013-08-01’和’month’表示日期仅精确到月(2013-08). ‘2013-08-01’和’day’表示日期完全是2013-08-01.

最好的方法是什么?

解决方法

我认为有两种可能的方法

(1)存储日期的子串,如:

'2013'               -- year 2013 
'2013-01'            -- year 2013,January
'2013-01-01'         -- year 2013,January 1

(2)存储3个不同的列,年,日(并且您可以构建索引年月日,没有问题)

2013  null  null     -- year 2013 
2013     1  null     -- year 2013,January
2013     1     1     -- year 2013,January 1st

哪一个最好取决于您想如何查询数据.假设您有存储过程,并且您希望传递参数以使所有行都进入条件状态.

在情况(1)中,您将字符串@Date =’2013-01’作为参数传递,并且您希望获得year = 2013和month = 01的所有行.因此where子句将是:

where left(Date,len(@Date)) = @Date

如果是(2),则传递三个参数 – @ Year = 2013,@ Month = 1,@ Day = null,where子句类似于:

where
    Year = @Year and -- Supposing @Year is always not null
    (@Month is null or @Month is not null and Month = @Month) and
    (@Day is null or @Day is not null and Day = @Day)

它可能更复杂,具体取决于您希望如何处理行.例如,如果您提供类似2013-01的参数,是否要获取其中month = null的行?

另一方面,如果你想通过日期并检查它是否属于日期范围,那么Gordon Linoff建议是一个很好用的建议.

原文链接:https://www.f2er.com/mssql/76895.html

猜你在找的MsSQL相关文章