【问题标题】:SQL-Server Datetime in WHERE Clause IssueWHERE 子句问题中的 SQL-Server 日期时间
【发布时间】:2016-07-14 14:20:06
【问题描述】:

enter image description here我正在创建一个包含两个值的查询,一个时期号和相应的日期。这些期间是与我们的月份相似但不完全相同的会计期间。日期在很大程度上是正确的,但我认为我会用 WHERE 语句清理一些不一致的地方。

例如,日期 4/1/2015 属于第 3 期,但它同时出现在第 3 期和第 4 期。为了解决这个问题,我想我会创建一个 WHERE 语句说明:

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

这带走了第 4 节的所有内容,而不仅仅是我需要的那个。我也尝试过 datetime 语法:

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

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

-EDIT- 忘记在第一个日期时间 WHERE 子句中添加单引号。

【问题讨论】:

  • table1.datetime的类型是什么?
  • @alex 是日期时间数据类型,句点是字符串。
  • 日期是否有时间值?与日期字符串进行比较时,您可能需要转换为日期。正如 '4/1/2015 01:00:00.000' 不等于 '4/1/2015' 但 CAST('4/1/2015 01:00:00.000' AS DATE) 一样。
  • 请注意,您还缺少字符串文字中的破折号? '2015-04-01' 我的猜测是日期问题不是实际问题。如果值中有时间,这也不起作用。
  • 也许如果您提供了 ddl 和一些示例数据,问题出在哪里很快就会变得很明显。我们只能猜测。

标签: sql-server datetime where


【解决方案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] 是什么),然后删除任何具有 @ 987654325@.

【讨论】:

  • Case 语句仅在您使用 OR 时更改输出。对 AND 条件进行相同评估的语句。让它们都带有 AND 语句意味着它们都必须为真才能保留在集合中
【解决方案2】:

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

那你可以试试这个

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

【讨论】:

  • 这适用于摆脱第 4 期(2015 年 4 月 1 日),同时保留所有其他第 4 期日期,但也摆脱了第 3 期(2015 年 4 月 1 日),这是正确的日期。
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 2010-12-29
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多