Sql 从时间间隔转换为语句
我试图将数据库中的时间值更改为语句。例如,06:00:00到12:00:00之间的时间间隔为上午,12:00:00到17:00:00之间的时间间隔为下午,依此类推。我使用的是这样的方法:Sql 从时间间隔转换为语句,sql,sql-server,Sql,Sql Server,我试图将数据库中的时间值更改为语句。例如,06:00:00到12:00:00之间的时间间隔为上午,12:00:00到17:00:00之间的时间间隔为下午,依此类推。我使用的是这样的方法: Update dbo.denouncement_term_day_time Set time_den = 'Morning' WHERE (DATEPART(HOUR, time_den) >= 6 AND DATEPART(MINUTE, time_den) >= 00 AND DAT
Update dbo.denouncement_term_day_time
Set time_den = 'Morning'
WHERE (DATEPART(HOUR, time_den) >= 6
AND DATEPART(MINUTE, time_den) >= 00
AND DATEPART(SECOND, time_den) >= 00) AND
(DATEPART(HOUR, time_den) <= 11
AND DATEPART(MINUTE, time_den) <= 59
AND DATEPART(SECOND, time_den) <= 59)
更新dbo.discountment\u term\u day\u time
设置时间=上午
其中(日期部分(小时,时间)>=6
和日期部分(分钟、时间)>=00
和日期部分(秒,时间>00)和
(DATEPART(小时,时间)试试这个-
ALTER TABLE dbo.denouncement_term_day_time
ADD time_den_new VARCHAR(20) NULL
GO
UPDATE dbo.denouncement_term_day_time
SET time_den_new =
CASE WHEN time_den BETWEEN '6:00:00' AND '11:59:59' THEN 'Morning'
WHEN time_den BETWEEN '12:00:00' AND '16:59:59' THEN 'Afternoon'
END
WHERE time_den BETWEEN '6:00:00' AND '16:59:59'
GO
ALTER TABLE dbo.denouncement_term_day_time DROP COLUMN time_den
GO
EXEC sp_rename 'dbo.denouncement_term_day_time.time_den_new', 'time_den', 'COLUMN'
试试这个-
ALTER TABLE dbo.denouncement_term_day_time
ADD time_den_new VARCHAR(20) NULL
GO
UPDATE dbo.denouncement_term_day_time
SET time_den_new =
CASE WHEN time_den BETWEEN '6:00:00' AND '11:59:59' THEN 'Morning'
WHEN time_den BETWEEN '12:00:00' AND '16:59:59' THEN 'Afternoon'
END
WHERE time_den BETWEEN '6:00:00' AND '16:59:59'
GO
ALTER TABLE dbo.denouncement_term_day_time DROP COLUMN time_den
GO
EXEC sp_rename 'dbo.denouncement_term_day_time.time_den_new', 'time_den', 'COLUMN'
我几乎不知道从哪里开始
为什么要在varchar()字段上多次调用DATEPART?这需要先隐式转换为datetime类型,这将非常昂贵。最好将字符串转换为datetime,然后再从那里开始工作
不要在数据库中存储“Morning”等。请使用CASE根据datetime值导出友好值。您可以直接在SELECT中执行此操作,也可以在视图中将其抽象出来
在此字段上调用DATEPART()还意味着您将来肯定会出错,因为您将在日期/时间字符串的位置设置回“Morning”之类的字符串
DATEPART(分钟,x)>=0和DATEPART(秒,x)>=0将始终返回true。不存在负分钟或负秒
同样,11:59:59的最后一次比较可以简化为DATEPART(HOUR,d)<12.Boom。不需要看分或秒。(这也处理分数秒,您可能不会以字符串形式处理分数秒。)
核心问题是varchar()字段中的某些内容不是可以隐式转换回的日期/时间
我的解决方案,使用计算列:
-- Add a new column for the proper datetime values.
ALTER TABLE denouncement_term_day_time ADD datetime_den datetime;
-- Clean your data before running the next line.
UPDATE denouncement_term_day_time SET datetime_den = CAST(time_den AS datetime);
-- Once converted, don't store the string dates anymore, it's wasteful
ALTER TABLE denouncement_term_day_time DROP COLUMN time_den;
-- Add a computed column to return the friendly time.
ALTER TABLE denouncement_term_day_time ADD friendly_time AS
CASE
WHEN DATEPART(HOUR, datetime_den) > 16 THEN 'Evening'
WHEN DATEPART(HOUR, datetime_den) > 11 THEN 'Afternoon'
ELSE 'Morning'
END
然而,即使这样也有问题,因为它假设用户与数据处于同一时区。理想情况下,这种事情应该在UI层中完成,在UI层中,您可以访问用户的位置、语言等,而不是深入到您的数据层中。我几乎不知道从何处开始
为什么要在varchar()字段上多次调用DATEPART?这需要先隐式转换为datetime类型,这将非常昂贵。最好将字符串转换为datetime,然后再从那里开始工作
不要在数据库中存储“Morning”等。请使用CASE根据datetime值导出友好值。您可以直接在SELECT中执行此操作,也可以在视图中将其抽象出来
在此字段上调用DATEPART()还意味着您将来肯定会出错,因为您将在日期/时间字符串的位置设置回“Morning”之类的字符串
DATEPART(分钟,x)>=0和DATEPART(秒,x)>=0将始终返回true。不存在负分钟或负秒
同样,11:59:59的最后一次比较可以简化为DATEPART(HOUR,d)<12.Boom。不需要看分或秒。(这也处理分数秒,您可能不会以字符串形式处理分数秒。)
核心问题是varchar()字段中的某些内容不是可以隐式转换回的日期/时间
我的解决方案,使用计算列:
-- Add a new column for the proper datetime values.
ALTER TABLE denouncement_term_day_time ADD datetime_den datetime;
-- Clean your data before running the next line.
UPDATE denouncement_term_day_time SET datetime_den = CAST(time_den AS datetime);
-- Once converted, don't store the string dates anymore, it's wasteful
ALTER TABLE denouncement_term_day_time DROP COLUMN time_den;
-- Add a computed column to return the friendly time.
ALTER TABLE denouncement_term_day_time ADD friendly_time AS
CASE
WHEN DATEPART(HOUR, datetime_den) > 16 THEN 'Evening'
WHEN DATEPART(HOUR, datetime_den) > 11 THEN 'Afternoon'
ELSE 'Morning'
END
然而,即使这样也有问题,因为它假设用户与数据处于同一时区。理想情况下,这种事情应该在UI层中完成,在UI层中,您可以访问用户的位置、语言等,而不是深入到数据层中。尝试一下
Update dbo.denouncement_term_day_time
Set time_den = 'Morning'
WHERE (DATEPART(HOUR, Convert(DATETIME, [time_den]), 8)) >= 6
AND DATEPART(MINUTE, Convert(DATETIME, [time_den]), 8)) >= 00
AND DATEPART(SECOND, Convert(DATETIME, [time_den]), 8)) >= 00)
AND ( DATEPART(HOUR, Convert(DATETIME, [time_den]), 8)) <= 11
AND DATEPART(MINUTE, Convert(DATETIME, [time_den]), 8)) <= 59
AND DATEPART(SECOND, Convert(DATETIME, [time_den]), 8)) <= 59)
更新dbo.discountment\u term\u day\u time
设置时间=上午
其中(DATEPART(HOUR,Convert(DATETIME,[时间]),8))>=6
和DATEPART(分钟,转换(DATETIME,[time_den]),8))>=00
和DATEPART(第二个,Convert(DATETIME,[time_den]),8))>=00)
和(DATEPART(HOUR,Convert(DATETIME,[time\u den]),8))试试这个
Update dbo.denouncement_term_day_time
Set time_den = 'Morning'
WHERE (DATEPART(HOUR, Convert(DATETIME, [time_den]), 8)) >= 6
AND DATEPART(MINUTE, Convert(DATETIME, [time_den]), 8)) >= 00
AND DATEPART(SECOND, Convert(DATETIME, [time_den]), 8)) >= 00)
AND ( DATEPART(HOUR, Convert(DATETIME, [time_den]), 8)) <= 11
AND DATEPART(MINUTE, Convert(DATETIME, [time_den]), 8)) <= 59
AND DATEPART(SECOND, Convert(DATETIME, [time_den]), 8)) <= 59)
更新dbo.discountment\u term\u day\u time
设置时间=上午
其中(DATEPART(HOUR,Convert(DATETIME,[时间]),8))>=6
和DATEPART(分钟,转换(DATETIME,[time_den]),8))>=00
和DATEPART(第二个,Convert(DATETIME,[time_den]),8))>=00)
和(DATEPART(HOUR,Convert(DATETIME,[time_den]),8))请根据您使用的sql风格添加一个标记(例如mysql)。您可以通过底部的编辑链接来完成这项工作。要做什么,请根据您使用的sql的风格(例如mysql)添加一个标记。您可以使用底部的“编辑”链接来执行此操作。要执行的操作点是和DATEPART(分钟,时间)>=00
和DATEPART(分钟,时间)=6和(DATEPART(小时,时间)谢谢,但这一点给出了“DATEPART函数需要2个参数”错误。很抱歉,您可以尝试更新dbo.declaument\u term\u day\u time Set[time\u den]=“Morning”其中(DATEPART(HOUR,CONVERT(Char(8),CONVERT(DATETIME,[time\u den]),8))>=6和DATEPART(MINUTE,CONVERT(Char(8),CONVERT(DATETIME,[time\u den]),8))>=00和DATEPART(SECOND,CONVERT(Char(Char(Char(8),CONVERT(DATETIME,[time,[time\u den]),8))>=00)和(DATEPART(HOUR,CONVERT(Char(8),CONVERT(DATETIME,[time_den]),8))谢谢,但这一个给出了“DATEPART函数需要2个参数”错误。很抱歉,您可以尝试更新dbo.declaument\u term_day_time Set[time_den]=“Morning”WHERE(DATEPART(HOUR,CONVERT(Char(8),CONVERT(DATETIME,[time_den]),8))>=6和日期部分(分钟,转换(字符(8),转换(日期时间,[时间]),8))>=00和日期部分(秒,转换(字符(8),转换(日期时间,[时间]),8))>=00和(日期部分(小时,转换(字符(8),转换(日期时间,[时间]),8))是的,你是对的,这不是一个好方法。但我是一个完全的初学者,我需要在ms sql数据工具中分析数据的项目中这样做。因此,我不会再使用它。非常感谢