【问题标题】:SQL查询不适用于函数DateAdd [关闭]
【发布时间】:2022-01-23 10:33:15
【问题描述】:
select DATEADD(day,-1,cast(getdate() as date)) as yesterday 
from dual;

我正在使用此查询从日期中减去一天,但这在我的 sql 服务器中显示无效标识符。能否请您提出一些替代方案。

【问题讨论】:

  • 查询对我有用。 “双重”存在吗?
  • 确保您拥有正确的架构。进入总是显式命名表模式的地方并不是一个坏习惯。例如select DATEADD(day,-1,cast(getdate() as date)) as yesterday from dbo.dual;
  • 请注意,GETDATE() 返回服务器的本地日期,该日期可能与您用户的日期相同。您永远不应该将本地日期+时间存储在数据库中:只存储 UTC 值(或基于 UTC 的值,例如 datetimeoffset除非您完全知道自己在做什么
  • 我正在使用 oracle
  • 那你为什么用 sql server 而不是 oracle 来标记你的问题呢?

标签: sql sql-server


【解决方案1】:

但这在我的 sql server 中显示无效标识符。

invalid identifier 错误是因为虚拟表 DUAL 在 MS SQL Server 中不存在。

DUAL 虚拟表是 Oracle、MySQL 8+ 和 MariaDB 的一项功能。

在 SQL Server (T-SQL) 中,在单行单列表中返回标量的惯用方式是:

  • 使用不带FROM 子句的SELECT - 这在T-SQL 中是允许的,但请务必在末尾使用分号:

    SELECT
        DATEADD( day, -1, CAST( GETDATE() AS date) ) AS yesterday;
    
  • 使用VALUES()table constructor

    SELECT
        t.yesterday
    FROM
        (
            VALUES
                ( DATEADD( day, -1, CAST( GETDATE() AS date) ) )
        ) AS t( yesterday )
    
    • 请注意,当VALUES() 表构造函数用作FROM 子句的直接子代时,整个表达式需要用括号括起来,这使它与VALUES() 语法中的INSERT 不同和MERGE 声明。
  • 使用 T-SQL @variable:

    DECLARE @yesterday date = DATEADD( day, -1, CAST( GETDATE() AS date) );
    SELECT @yesterday AS yesterday;
    

【讨论】:

  • 第二个选项导致Incorrect syntax near the keyword 'VALUES'
  • 如果你想要更多的列,这里有一个简单的例子select t.* from ( values (1, 'one'), (2, 'two') ) t(id, name)
  • 我正在使用 oracle
  • @AyushmaanAgrawal 这不是你在问题中所说的!你把 sql server 放在那里
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多