【问题标题】:How to check already date range inserted per month into db using sql query如何使用 sql 查询检查已每月插入数据库的日期范围
【发布时间】:2017-11-03 22:01:11
【问题描述】:

如何使用 sql 查询检查已每月插入数据库的日期范围

DECLARE @TODAY DATETIME
    DECLARE @STARTDATE DATETIME,@ENDATE DATETIME
    SET @STARTDATE= DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0)
    SET @ENDATE= DATEADD (dd, -1, DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) + 1, 0))


    IF NOT EXISTS (select date  from table where date between @STARTDATE and @ENDATE)

如果(@D_INVOICE_DATE >= @TODAY) 开始 - -插入 - 结尾 别的 开始 打印“存在” 结尾 但一次又一次地插入数据库 我的要求是每月只在基于数据库的月份中插入一条记录

【问题讨论】:

  • 列日期日期时间和你的存储时间值?示例“2017 年 10 月 30 日 17:00:00”
  • 您需要在此处提供有关您要执行的操作的更多详细信息。你也可以看看这个。 sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/… 具体看日期部分的部分。

标签: sql-server tsql stored-procedures


【解决方案1】:
  1. 将日期时间转换为日期,但这会使用索引来杀死

    如果不存在(从 @STARTDATE 和 @ENDATE 之间的 CAST(日期作为日期)的表中选择 *)

  2. SET @ENDATE= DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) + 1, 0)

    如果不存在(从日期 >= @STARTDATE 和日期

【讨论】:

  • 实际上将日期(时间)转换为另一个有点奇怪。它实际上是完全 sargable 并且不会抑制索引的使用。它违背了“不要在列上使用函数”的口头禅,但它是实际上没问题的极少数情况之一。
  • DROP TABLE IF EXISTS #a CREATE TABLE #a (Dt Datetime DEFAULT GETDATE() PRIMARY KEY CLUSTERED) SELECT Dt FROM #a WHERE Dt = GetDate() SELECT Dt FROM #a WHERE CAST(Dt as日期) = GetDate()
  • @Sean Lange 比较两个计划和他的谓词
  • 那不是一个有效的测试。这是针对具有单列且没有行的表运行两个选择语句。顺便说一句,他们都有一个索引搜索。想要几个链接来演示? blogs.lobsterpot.com.au/2010/01/22/… 另一个connect.microsoft.com/SQLServer/feedback/details/526431/… 当然有一个警告。 dba.stackexchange.com/questions/34047/…
  • @single column@more column 更改执行计划这个查询?好的
猜你喜欢
  • 2022-01-03
  • 2017-03-22
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 2014-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多