2016-07-14 88 views
0

enter image description here我正在创建两个值的查询,一个周期号和相应的日期。期间是与我们的月份相似但不相同的会计期间。日期大体上是正确的,但是我认为我会用WHERE语句清理一些不一致的地方。WHERE子句中的SQL-Server日期时间问题

例如,日期2015年4月1日所属期3,但在这两个周期3和周期4显示了为了解决这个问题,我想我会创建一个WHERE语句中指出:

SELECT DISTINCT table1.period, 
       table1.datetime 
FROM table1 
WHERE table1.period <> 4 AND table1.datetime <> '4/1/2015' 

这带走了所有的4期而不是我需要的。我也尝试了日期时间语法:

AND table1.datetime <> '20150401 00:00:00.000' 

两种语法都有相同的结果。我在SQL方面相当缺乏经验,并一直讨厌处理日期时间值,所以任何帮助都会很棒。

-EDIT-忘记将单引号添加到第一个datetime WHERE子句中。

+0

这是table1.datetime的类型? –

+0

@alex它是一个日期时间数据类型,而period是一个字符串。 – GHINOTE

+1

它有日期的时间值吗?比较日期字符串时,您可能需要将日期转换为日期。如'2015年4月1日01:00:00.000'不等于'2015年4月1日',但CAST('4/1/2015 01:00:00.000'AS DATE)。 – BinaryPatrick

回答

1

尝试以下操作:

SELECT DISTINCT table1.period, 
      table1.datetime 
FROM table1 
WHERE CASE WHEN table1.period = 4 AND CONVERT(VARCHAR(8),table1.datetime,112) = '20150401' THEN 1 ELSE 0 END = 0 

这只摆脱行既具有period=4datetime=20150401的,而你的查询首先摆脱任何有period=4 (不管[datetime]是什么),那么摆脱任何事情都有datetime=20150401

+0

当您使用OR时,Case语句只会改变输出。 AND条件的评估结果相同。让他们同时有一个AND语句意味着他们都必须是真的留在集合中 – BinaryPatrick

+0

这是有效的。对不起,但我还不能满足。 – GHINOTE

0

你说那段时间是字符串字段吗?你的意思是一个varchar?
此外,你只想检查日期部分,而不是时间?

,那么你可以试试这个

SELECT DISTINCT table1.period, 
       table1.datetime 
FROM table1 
WHERE table1.period <> '4' 
AND convert(date, table1.datetime) <> '20150401' 
+0

这可以在保留所有其他第4期日期的同时摆脱第4期(2015年4月1日),但也可以摆脱正确日期的第3期(4/1/2015)。 – GHINOTE

+0

确定它不是很清楚我想要什么 – GuidoG