sql-server - 使用 Datediff 时转换 108 和格式的行为差异
问题描述
我正在尝试从日期时间字段中提取 HH:MM:SS 部分,并使用它来获取提取部分之间的日期差异(以分钟为单位)。但是,我使用 conver (108) 得到了不同的行为,这给了我准确的结果,而格式给出了不正确的结果。
declare @DATE1 SMALLDATETIME = '2019-02-22 06:15:00'
, @DATE2 SMALLDATETIME = '2019-02-22 14:15:00'
select datediff( minute, convert(varchar(10), @DATE1,108)
,convert(varchar(10), @DATE2,108) ) [Total Mins from Convert],
convert(varchar(10), @DATE1,108) [Value from Convert] ,
format(@DATE1,'hh:mm:ss') [Value from Format] ,
datediff( minute, cast(format(@DATE1,'hh:mm:ss') as time) ,
cast(format(@DATE2,'hh:mm:ss') as time) ) [Total Mins from Format]
输出:
Total Mins from Convert Value from Convert Value from Format Total Mins from Format
480 06:15:00 06:15:00 -240
我可以毫无问题地使用转换来正确获取日期差异,但想了解为什么当 HH:MM:SS 与转换相同时 Format 会显示差异。如果我给@date2 变量<= 12 pm 它给了我正确的“格式”和“转换”结果,但是如果我的@hour 超过12 pm 像这个例子中的14:15 它给我不正确的结果.
是因为 format 有 12 小时时间格式,而 convert 有 24 小时时间格式吗?是否可以更改“格式”功能的时间格式。如果可能的话,任何人都可以帮助我解释和改变 Format 函数的行为吗?
解决方案
尝试使用HH
来表示 24 小时时间:
SELECT
DATEDIFF(minute, CONVERT(varchar(10), @DATE1, 108),
CONVERT(varchar(10), @DATE2, 108)) [Total Mins from Convert],
CONVERT(varchar(10), @DATE1, 108) [Value from Convert],
FORMAT(@DATE1,'HH:mm:ss') [Value from Format],
DATEDIFF(minute, CAST(FORMAT(@DATE1,'hh:mm:ss') AS time),
CAST(FORMAT(@DATE2, 'HH:mm:ss') AS time)) [Total Mins from Format];
这会输出480
两个分钟值和06:15:00
两个时间。
推荐阅读
- php - 如何使用带有 craue/CraueFormFlowBundle 步进器的 Symfony4 FormEvent onChange 字段来更新或验证表单?
- performance-testing - 使用 Locust 进行分布式 A/B 类测试
- android - Android:使用 Kotlin 模糊 LinearLayout 的背景
- python - TypeError:classification_report() 得到了一个意外的关键字参数“output_dict”
- vue.js - 将路由推送到函数内的父组件(Vue)
- node.js - 定义模型后是否需要 Model.init() ?续集打字稿
- laravel - Laravel 选择字段验证
- ios - 无法在我的 TableView 中显示自定义单元格文件?
- java - 处理公共/中心对象的最佳方式
- java - 如何将对象存储在另一个类中的一个类的数组列表中