如果信用卡的有效期只包含月份和年份,我该如何存储它?
Posted
技术标签:
【中文标题】如果信用卡的有效期只包含月份和年份,我该如何存储它?【英文标题】:How do I store a credit card's expiration date if it only consists of the month and year? 【发布时间】:2011-08-07 10:30:39 【问题描述】:mysql 中的日期字段接受以下格式:yyyy-mm-dd。使用该格式时,没有日期的到期日期并非无效。
我是否使用 varchar 代替?这是否不妨碍我进行计算以确定卡何时到期以及什么时候到期?
【问题讨论】:
是否总是只有一个月和一年? (我知道有些卡片上印有日期,但您需要存储日期吗?) 您知道存储信用卡数据是一个相当复杂的领域,甚至受法律监管,例如在美国?参见例如***.com/questions/2240705/online-credit-card-storage 与在数据库中存储信用卡数据相关***.com/questions/3328922/… @Pekka,我知道,但不幸的是我别无选择。客户需要每月定期计费,外包成本太高(不在美国)。网站上安装了SSL,所有卡号和ccv号都使用AES加密。 【参考方案1】:以标准日期格式存储时,只需使用每月的第一天。转换、比较等的日期格式很方便。
【讨论】:
但是每月的第一天和月份本身是两个不同的概念。 此外,当卡片的到期日期设置为,例如,2015 年 3 月,当我们在 2014 年 3 月 15 日时,它仍然是一张有效的卡片。如果我们设置了当月的第一天,然后我们进行比较,3月15日大于3月1日,所以对比较查询无效。我宁愿把一个月的第一天加上一个月的日期(所以 2015 年 3 月将变为 2015 年 4 月 1 日)。但是,这样您会丢失原来的到期日期(知道您只增加了一个月,可以重新计算)。【参考方案2】:2014 年 1 月:
2014-01-00
通常使用 00 表示未定义的月份和日期。来自MySQL reference manual:
某些日期函数可以用于“零”日期或不完整的日期,例如“2001-11-00”,而其他日期函数则不能。提取部分日期的函数通常适用于不完整的日期,因此当您可能期望一个非零值时可以返回 0。例如:
mysql> SELECT DAYOFMONTH('2001-11-00'), MONTH('2005-00-00'); -> 0, 0
以后在DATE_FORMAT
的手册中:
月份和日期的范围 说明符以零开头,因为 事实上,MySQL 允许存储 不完整的日期,例如“2014-00-00”。
【讨论】:
【参考方案3】:您总是可以只使用LAST_DAY
函数来插入该月的最后一天。
例如:
SELECT LAST_DAY('2011-02-01')
将导致今年 2011-02-28。一般来说,您希望信用卡在一个月的最后一天,因为那是信用卡有效的实际最后一天。
【讨论】:
@ypercube:(a) 你必须注意一天中的时间——确实应该与下个月的第一天进行比较,并且 (b) 零售商不应该是那个确定卡在什么时刻到期;这是信用卡公司的授权。 @Jason:我 100% 同意你所说的一切。即使存储了每月的第一天,也没有人可以确定是否会过期。谁知道信用卡公司使用哪个时区? @Jason S:您说得对,零售商无论如何都应该尝试使用信用卡,但如果失败,最好说“您的信用卡失败:看起来可能有过期了。”以上是关于如果信用卡的有效期只包含月份和年份,我该如何存储它?的主要内容,如果未能解决你的问题,请参考以下文章
在数据库中,如果只需要年份和月份,您会使用日期字段还是年份和月份字段?
如何在包含单词、三个字母月份和两位数字年份的字符串中搜索月份和年份并将它们转换为 SQL 中的日期?