【问题标题】:New table insert if Date field is before the current time如果日期字段早于当前时间,则插入新表
【发布时间】:2018-04-13 22:56:22
【问题描述】:

我想为任何具有日期字段的记录进行表格插入,该字段至少在current datetime 之前是10 minutes。出于某种原因,我的表没有创建新的插入。下面是示例代码:

If Not Exists (Select * from dbo.Table where RecordName = @RecordName and DateAdd(Minute, 10, GETDATE()) >=1)
Insert Into dbo.Table (RecordName, DateField, Field3, Field4)
Value (@RecordName, GETDATE(), '0','0');

仅供参考,我使用RecordName 作为参数。请帮忙!

【问题讨论】:

  • 只运行子查询会发生什么?
  • DateAdd(Minute, 10, GETDATE()) >=1 总是正确的,我认为 DateAdd(Minute, -10, GETDATE()) >= DateField 可以满足您的需求
  • 更正 - DateAdd(Minute, 10, GETDATE()) >=1 始终为假
  • 请标记您的 dbms。 SQL 是一种语言。

标签: sql sql-server sql-insert not-exists


【解决方案1】:

你的问题是:

DateAdd(Minute, 10, GETDATE()) >=1

您将DATETIMEINTEGER 进行比较

在我的时区,现在是 2017 年 11 月 1 日上午 8:27,DateAdd(Minute, 10, GETDATE()) 会给你'11/1/2017 8:37 AM' >= 1

1 作为 DATETIME 将评估为 1900-01-02 00:00:00.000 SELECT CAST(1 AS DATETIME)

因此,您将测试何时不存在比 1900-01-02 00:00:00.000 更新的时间,我认为这在您的数据集中不太可能出现。

如何更正您的意图。您可能有一个日期/日期时间字段,如果您将其与

DATEADD(minute,-10,GETDATE())

If Not Exists (Select * from dbo.Table where RecordName = @RecordName and DateField >= DateAdd(Minute, -10, GETDATE()))
Insert Into dbo.Table (RecordName, DateField, Field3, Field4)
Value (@RecordName, GETDATE(), '0','0');

【讨论】:

  • 为了比较,日期时间字段将被转换为整数(基本上是自 1900-01-01 以来的天数,因此始终 >= 1
  • @GarethLyons - 不,恰恰相反。 datetime 类型具有更高的 precedence 所以它是 int 转换为 datetime
  • @GarethLyons damien 是正确的,由于优先级,它实际上与日期时间相反,但无论哪种情况,OP 都没有比较他/她认为的方式。 1 也是 1900-01-02 0 实际上是 1900-01-01
  • 谢谢@Matt!这完美地回答了我的问题!
猜你喜欢
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多