sql-server - 当时间格式不同时,Datetime 为 NULL
问题描述
我有特定的时间场景,可以是 4 位、6 位,也可以是 NULL 或字符串,如下所述。在场景 3 和 4 中,我的计算日期时间的方法不起作用并以 NULL 的形式出现 有没有办法将 00:00:00:000 的日期作为案例 3 和 4 的时间?& 对于 1,它应该是 10:02:00:000
DECLARE @DATE VARCHAR(10) =CAST(GETDATE() AS DATE)
DECLARE @Time1 VARCHAR(10) = '1002'
DECLARE @Time2 VARCHAR(10) = '160634'
DECLARE @Time3 VARCHAR(10) = '0900XX'
DECLARE @Time4 VARCHAR(10) = ''
SELECT TRY_CONVERT(DATETIME, @DATE +' '
+LEFT(ltrim(@Time1), 2)
+ ':' + SUBSTRING(@Time1, 3, 2)
+ ':' + RIGHT(rtrim(@Time1), 2)) , TRY_CONVERT(TIME, @Time1), @Time1 AS Time
SELECT TRY_CONVERT(DATETIME, @DATE +' '
+LEFT(ltrim(@Time2), 2)
+ ':' + SUBSTRING(@Time2, 3, 2)
+ ':' + RIGHT(rtrim(@Time2), 2)) , TRY_CONVERT(TIME, @Time2), @Time2 AS Time
SELECT TRY_CONVERT(DATETIME, @DATE +' '
+LEFT(ltrim(@Time3), 2)
+ ':' + SUBSTRING(@Time3, 3, 2)
+ ':' + RIGHT(rtrim(@Time3), 2)) , TRY_CONVERT(TIME, @Time3), @Time3 AS Time
SELECT TRY_CONVERT(DATETIME, @DATE +' '
+LEFT(ltrim(@Time4), 2)
+ ':' + SUBSTRING(@Time4, 3, 2)
+ ':' + RIGHT(rtrim(@Time4), 2)) , TRY_CONVERT(TIME, @Time4), @Time4 AS Time
解决方案
我个人会将值“填充”为 6 位数字,注入:
字符,然后使用TRY_CONVERT
. 然后,您可以ISNULL
在中途返回失败的转换:
SELECT ISNULL(TRY_CONVERT(time(0),STUFF(STUFF(RIGHT('000000' + V.VarcharTime,6),5,0,':'),3,0,':')),'00:00:00')
FROM (VALUES(@Time1),
(@Time2),
(@Time3),
(@Time4))V(VarcharTime);
If1002
意味着10:02:00
而不是00:10:02
然后填充右侧,而不是左侧:
SELECT ISNULL(TRY_CONVERT(time(0),STUFF(STUFF(LEFT(V.VarcharTime+'000000',6),5,0,':'),3,0,':')),'00:00:00')
FROM (VALUES(@Time1),
(@Time2),
(@Time3),
(@Time4))V(VarcharTime);
推荐阅读
- java - Android Bitmap.CompressFormat.WEBP 崩溃
- python - 我应该如何安装和导入 simpletransformers?
- java - 在类之间共享java中的变量
- c++ - 如何设置 clang 格式的注释 pragma,以免触及多行 doxygen 注释?
- mysql - 替换特殊字符
- c# - 如何在单元测试中调用 Postsharp Aspect?
- ionic-framework - ionic 4 离子网格不会居中/
- python - 使用行值函数的flask-sqlalchemy查询
- google-cloud-run - 如何获取或生成 Google Cloud Run 服务的部署 URL
- mysql - 在 MySQL 中查找多个数据库中的重复值