SQL Server中应使用GETDATE()或SYSDATETIME()而非MySQL的NOW();二者均非确定性,不可用于索引视图;需用AS指定列名,且注意精度、类型兼容及时区问题。

SQL Server里用GETDATE(),别用NOW()
NOW() 是 MySQL 的函数,在 SQL Server 视图里直接写会报错:Invalid column name 'NOW' 或 Incorrect syntax near '('。SQL Server 原生支持的是 GETDATE()(返回 datetime 类型)和更精确的 SYSDATETIME()(返回 datetime2(7))。视图定义中允许调用这些非确定性函数,但要注意它们在查询时每次求值——不是建视图那一刻“冻结”的时间。
视图中写法要加别名,否则列名是(No column name)
直接写 GETDATE() 会导致生成的列没有名字,下游应用或报表工具可能报“无法绑定”或取不到字段。必须显式用 AS 赋予列名:
CREATE VIEW v_order_summary AS SELECT order_id, status, GETDATE() AS current_time, SYSDATETIME() AS current_timestamp FROM orders;
不加 AS 的后果:查询 SELECT * FROM v_order_summary 时,最后一列显示为 (No column name),用程序读取时容易出错。
注意时区和精度差异:选GETDATE()还是SYSDATETIME()?
两者都基于服务器本地时钟,不自动转 UTC;区别主要在精度和类型:
-
GETDATE()返回datetime,精度约 3.33 毫秒,范围 1753–9999 年 -
SYSDATETIME()返回datetime2(7),精度 100 纳秒,范围 0001–9999 年 - 如果视图后续要做时间差计算(比如
DATEDIFF(ms, created_at, current_time)),用SYSDATETIME()更准,但需确认下游兼容datetime2
常见误操作:混用类型导致隐式转换失败,例如把 GETDATE() 和 datetime2 字段直接相减,可能触发截断警告或意外舍入。
不能在索引视图里用GETDATE()这类非确定性函数
如果试图给含 GETDATE() 的视图创建唯一聚集索引,SQL Server 会拒绝并报错:Cannot create index on view 'xxx' because it contains the nondeterministic function 'GETDATE'。这是硬限制——索引视图要求所有表达式必须是确定性的。此时只能改用计算列(如果基表有时间戳字段)或放弃索引视图。
真正麻烦的地方在于:错误往往出现在上线后才暴露,因为开发环境可能没建索引,而生产环境为了性能加了索引却忘了检查函数确定性。

















