如何通过DATEDIFF函数获取时间戳或日期?SQL特殊语法解析
DATEDIFF(wk, 6, GETDATE())写法解释 这是SQL Server环境下特有的非标准写法,依赖SQL Server内置的隐式日期转换规则,不属于ANSI通用SQL语法,在MySQL、PostgreSQL、Oracle等其他数据库中直接运行会报参数类型错误。
- 首先明确SQL Server中
DATEDIFF的原生语法为DATEDIFF(时间单位, 起始时间, 结束时间),作用是返回两个时间点在指定时间单位下的整数差值,本身不会直接返回日期/时间戳类型结果。 - SQL Server存在固定的隐式转换逻辑:当整数类型的值被传入需要日期类型的参数位时,会以
1900-01-01 00:00:00.000为基准零点,整数n就对应基准日期往后加n天的时间点。你看到的第二个参数6,实际被隐式转换为1900-01-07 00:00:00(1900年1月1日为周一,加6天恰好是周日零点)。 - 第一个参数
wk是时间单位「周」的缩写,因此这段代码的实际计算逻辑是:统计从1900年1月7日零点到当前时间(GETDATE()返回当前系统时间)之间,一共跨越了多少个周边界,返回值是整数类型的周数差。
很多老SQL Server代码里用这个写法,本质是为了做周维度的时间截断:因为1900-01-07是周日,这个计算得到的周差值在同一个周(周日到下周六的周期)内是固定值,搭配
DATEADD函数做偏移计算,就能快速拿到任意日期对应的周起始、周结束时间,比如DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 6)就能得到当前周的周日零点时间戳。你看到的注释里提到的「预期返回时间戳类型结果」,大概率是省略了外层搭配DATEADD的逻辑,单独执行这段DATEDIFF代码只会返回整数。
内容的提问来源于stack exchange,提问作者Rashida
相关产品推荐
相关产品推荐

