【问题标题】:date comparison in sql serversql server中的日期比较
【发布时间】:2012-09-24 12:25:03
【问题描述】:

我正在尝试显示从今天的日期起 30 天的日期(我在表中有一个日期列)的记录。一旦它显示出来,我需要通过添加 Date= 今天的日期的详细信息来创建新记录。 我试过这个:

select * from 
paymenthist 
where 
Date = CONVERT(datetime, CONVERT(varchar, DATEADD(day, -30, GETDATE()), 101))

但是所有记录都在显示..

【问题讨论】:

  • 您在下面有几个答案,您需要考虑转换/转换表中每条记录的严重性能影响。
  • 转换成VARCHAR再转回DATE的任何理由?
  • 您是要获取 30 天前的特定日期还是从现在到 30 天前的几天范围?无论哪种方式,如果“日期”字段的类型为日期时间(或日期时间 2)而不是日期类型,那么您需要搜索一个时间范围,从第一天开始,直到但不包括最后一天之后的一天的开始。即,“其中 Date > x AND Date
  • 我正在尝试仅获取 30 天前特定日期的所有记录。使用上面的方法会出现错误:从 char 转换为 datetime 导致超出范围值!!

标签: sql-server date-comparison date-math


【解决方案1】:

好的,我承认我建议的方式可能效率低下,但如果一个是日期时间,另一个是日期,那么我相信这将比 >=

CREATE TABLE ##PaymentHistory
(
ID INT IDENTITY,
[Date] DATETIME,
Col1 INT,
Col2 INT
)

INSERT INTO ##PaymentHistory([Date],Col1,Col2)
VALUES(FLOOR(CAST(GETDATE() -29 AS FLOAT) ) ,1,1)
, (FLOOR(CAST(GETDATE() -30 AS FLOAT) ) ,2,2)
, (FLOOR(CAST(GETDATE() -31 AS FLOAT) ) ,3,3)

SET IDENTITY_INSERT ##PaymentHistory ON

INSERT INTO ##PaymentHistory(ID, [Date], Col1, Col2)
SELECT ID, GETDATE(), Col1, Col2 
FROM ##PaymentHistory 
WHERE CAST(Date AS FLOAT) = FLOOR(CAST(GETDATE() -30 AS FLOAT) ) 

SET IDENTITY_INSERT ##PaymentHistory OFF

【讨论】:

  • 使用这个我以前的记录正在改变......否则即对于预期的记录它正在工作
  • 当您说您以前的记录正在更改时,您的意思是它还返回第 31 天、第 32 天等的结果吗?
  • ya..它的 ID 被改变了。我只需要添加 Id 保持不变的新记录,但 date=+30 从以前的记录中获取相同的 Id 并添加更多详细信息.. ID 和日期是复合主键..
  • 是ID和Identity列吗?如果是这样,您将需要 SET IDENTITY INSERT PaymentHistory ON 并单独指定插入语句中的每一列
  • 您能否详细说明 SET IDENTITY INSERT 或发布有关它的链接.. 我不太了解它.. 谢谢
【解决方案2】:

这在一定程度上取决于日期列的数据类型,但试试这个。

select * from paymenthist where cast(Date as date) =  cast(DATEADD(day, -30, GETDATE()) as date)

【讨论】:

  • 与上述相同的注释 - 您不想以这种方式对 where 子句中的字段执行转换。
猜你喜欢
  • 2021-11-03
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多