Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何检查特定的日期格式?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 如何检查特定的日期格式?

Sql 如何检查特定的日期格式?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我对约会有意见。问题是,ISDATE会给我有效的日期,即使格式不同。但是,我想做的是,插入NULL是任何未格式化为:8/28/2013或08/28/2013的日期字段 这是国际通用的。仅供美国使用。这意味着:2013年8月8日意味着2011年8月8日。并将出演2011-08-08 我不知道如何检查格式。我什么时候可以做整个案子 我试着这样玩: DECLARE @d DATETIME = '10/01/2011'; SELECT CASE WHEN @d != FORMAT ( @d, 'yyyy

我对约会有意见。问题是,ISDATE会给我有效的日期,即使格式不同。但是,我想做的是,插入NULL是任何未格式化为:8/28/2013或08/28/2013的日期字段

这是国际通用的。仅供美国使用。这意味着:2013年8月8日意味着2011年8月8日。并将出演2011-08-08

我不知道如何检查格式。我什么时候可以做整个案子

我试着这样玩:

DECLARE @d DATETIME = '10/01/2011';
SELECT CASE WHEN @d != FORMAT ( @d, 'yyyy/MM/dd', 'en-US' ) THEN @d ELSE NULL END
列中当前的日期格式如下。2013年8月28日或2013年8月28日 如果格式正确,我会做一个演员


谢谢

看起来您正在获取一个
datetime
列,有意将其转换为字符串(从而对其进行格式化),然后查找不符合该格式的实例

事实是,格式只有在你制作的时候才相关。SQL没有将其存储为“01/01/2013”或“1/1/2013”--它仅使用默认转换或您提供的格式显示

因此,这个问题毫无意义。您不会在数据中发现异常,只会发现您没有获得所需格式的实例

关于清理,当SQL转到INSERT/UPDATE(格式不好[您提到的
0808/21/20133
])时,您会得到如下结果:

从字符串转换日期和/或时间时,转换失败


您可以将日期存储为varchar,然后使用以下查询的格式存储:

DECLARE @d varchar(10) 
set @d= '08/28/2013';
SELECT CASE WHEN @d LIKE '[0-1][0-9]/[0-3][0-9]/[1-2][0-9][0-9][0-9]' THEN @d ELSE NULL END

我假设该列不是
date
/
datetime
列?否则这个问题就没有意义了,因为格式实际上并没有被保留,只是保留了它背后的信息。(或者您正在查看SQL default在转换为字符串/显示时如何格式化列)它是一个日期,但应用程序验证不存在,因此输入的日期类似于:0808/21/20133,请考虑更糟糕的输入。我正在整理一些历史数据。您如何确定2013年9月8日是否正确?是2013年9月8日还是2013年8月9日?2013年6月8日呢?或者是2013年8月6日,或者不是,也许……20133年8月21日不可能是日期。我不同意你的观点:我正在处理CSV和文本文件中的历史数据。长话短说,由于这些格式,转换失败了。我觉得解释很简单。那么,通过CSV解析如何等同于对SQL中的
datetime
列执行维护呢?(也许是我弄糊涂了?)上面的方法不起作用,如果我这样做,它会抛出一个转换错误:08/28/20133,我只需要得到一个空值,而不是错误。无论如何,谢谢你的帮助和时间。我认为扩展变量大小可以解决这个问题。我认为将日期存储为varchar是一个可怕的想法。@DanBracuk:这里,用户说用户可以插入任何不能使用日期格式的日期,我不知道如何在datetime类型的变量中存储像“08/28/20133”这样的值。