2016-04-22 72 views
1

我需要检查存储在SQL表中的格式是否为YYYY-MM-DD。检查格式是否为YYYY-MM-DD

+2

Tag dbms used! (当涉及到日期/时间时,太多的产品远远不符合ANSI SQL标准。) – jarlh

+4

但是,您为什么需要这样做?总是使用'日期'数据类型的日期... – jarlh

+0

我正在分析一个已经存在的数据集。我试过了:像'%YYYY-MM-DD%''但是确定它是否正确。 –

回答

1

尝试这种方式

SELECT CASE WHEN ISDATE(@string) = 1 
    AND @string LIKE '[1-2][0-9][0-9][0-9]/[0-1][0-9]/[0-3][0-9]' 
    THEN 1 ELSE 0 END; 

@string是日期。

3

你不存储特定的格式(我认为MS SQL存储为两个整数),你选择你的格式输出。当我说你选择时,我的意思是你有你的默认值(大多数是在安装MS SQL时自动设置,或者基于你的国家,时区等使用的任何设置 - 你可以改变这一点)以及你在执行脚本时选择的默认值。

+1

MS-SQL Server将日期存储为浮点数。试试这个:SELECT CAST({d'1900-01-01'} AS FLOAT)作为FirstPossible,CAST(GETDATE()作为FLOAT)作为CurrentDate'。整数部分是自1900-01-01以来的天数,而逗号后面的部分是当天的时间。这就是为什么增加时间会导致1900年1月某个地方有趣的日期的原因:-) – Shnugo

0

你可以设置格式,但据我所知不能检查格式。

2

首要的是:如果日期值存储在datedatetime或等效的时态数据类型列中,那么在数据库级别中不会有日期格式。日期本身已通过在特定数据库引擎的给定数据类型中定义的规则进行验证,并以其定义的任何二进制格式进行存储。

如果数据是一个字符串(从文件或例如VARCHAR列),那么你可以,如果它是在使用TO_DATE()TRY_CONVERT()功能在MySQL的SQL Server和STR_TO_DATE()的新版本给定的格式验证,或者你可以使用第三方/自己写的模块/ clrs来做到这一点。

这些验证只会检查字符串是否符合给定的格式,而日期部分是否在可接受的日期范围内,但不会测试值的含义。将02/03/2005字符串转换为日期也适用于MM/DD/YYYYDD/MM/YYYY格式,除非我们有关于最初存储它的环境的信息,否则无法确定哪一个是真正的值。

永远不要将时态数据存储在基于字符的列(如varchar)中,使用符合您需要的数据类型(DATE/DATETIME/TIMESTAMP/whatever)。

+0

@完全同意一个小*但*:如果您使用独立于文化的格式,如ODBC或ISO8601,则可以存储此字符。否则,其中没有类型安全的XML可能:-) – Shnugo

+0

部分同意以下评论:如果您以字符格式存储它,请保持格式一致并以可靠的格式存储包括时区在内的所有部分(如@Shnugo提及的那些部分),并且只有当存储引擎不支持临时存储类型时(如已经提到的XML)。在答案中,我正在谈论数据库,因此最后的评论意味着关于数据库而不是其他存储格式。 – Pred