下面这串sql代码中如何将提取出的时间为24小时制UPDATE userbehavior SET date_time =dateadd(second,timestamps,’1970-1-1 08:00:00’)
时间: 2024-03-03 16:49:55 浏览: 115
这串 SQL 代码中,您可以使用 DATEPART() 函数来提取出时间的小时部分,然后根据小时部分是否大于等于 12 来判断该时间是否为下午时段。如果是下午时段,则将小时部分加上 12,转换成 24 小时制。修改后的 SQL 代码如下:
```
UPDATE userbehavior
SET date_time = DATEADD(second, timestamps, '1970-01-01 08:00:00')
WHERE DATEPART(hour, DATEADD(second, timestamps, '1970-01-01 08:00:00')) < 12;
UPDATE userbehavior
SET date_time = DATEADD(hour, 12, DATEADD(second, timestamps, '1970-01-01 08:00:00'))
WHERE DATEPART(hour, DATEADD(second, timestamps, '1970-01-01 08:00:00')) >= 12;
```
这段代码会将时间转换成 24 小时制,并将时间加上 8 小时,因为时间戳是从 1970 年 1 月 1 日 UTC 时间开始算起的,而中国的时区比 UTC 时间早 8 小时。
相关问题
DECLARE @start_date DATETIME DECLARE @end_date DATETIME DECLARE @DAM_ID DECLARE @SENSOR_ID DECLARE @WATER_TOP DECLARE @WATER_LEVEL SET @DAM_ID SET @SENSOR_ID SET @WATER_TOP SET @WATER_LEVEL SET @start_date = '2023-05-01 00:00:00' SET @end_date = GETDATE() WHILE @start_date <= @end_date BEGIN SET @DAM_ID = '27' SET @SENSOR_ID = '65' SET @WATER_TOP = SELECT '231.9' + CAST(FLOOR(RAND()*999999) AS VARCHAR(255)) SET @WATER_LEVEL = SELECT '129.7' + CAST(FLOOR(RAND()*999999) AS VARCHAR(255)) INSERT INTO [B_DAM_WATER_LEVEL] (DAM_ID,SENSOR_ID,WATER_TOP,HOLE_DEPTH,WATER_LEVEL,UPLOAD_TIME) VALUES (@DAM_ID,@SENSOR_ID,@WATER_TOP, @WATER_LEVEL,@start_date) SET @start_date = DATEADD(HOUR, 1, @start_date) END 这个存储过程报错你帮我解决一下
您好,根据您提供的存储过程代码,有以下几个问题:
1. 在设置变量值时,应该使用 SET @WATER_TOP = '231.9' + CAST(FLOOR(RAND()*999999) AS VARCHAR(255)),而不是 SET @WATER_TOP = SELECT '231.9' + CAST(FLOOR(RAND()*999999) AS VARCHAR(255)),同理对于 @WATER_LEVEL 的设置也是如此。
2. 在 INSERT INTO 语句中,HOLE_DEPTH 这一列缺少值,需要设置其值。
3. 在 VALUES 后面的括号中,应该将 @start_date 放在最后一个参数的位置,即 INSERT INTO [B_DAM_WATER_LEVEL] (DAM_ID,SENSOR_ID,WATER_TOP,HOLE_DEPTH,WATER_LEVEL,UPLOAD_TIME) VALUES (@DAM_ID,@SENSOR_ID,@WATER_TOP, @WATER_LEVEL,@start_date)。
修改后的存储过程代码如下:
```
DECLARE @start_date DATETIME
DECLARE @end_date DATETIME
DECLARE @DAM_ID INT
DECLARE @SENSOR_ID INT
DECLARE @WATER_TOP VARCHAR(255)
DECLARE @WATER_LEVEL VARCHAR(255)
SET @DAM_ID = 27
SET @SENSOR_ID = 65
SET @start_date = '2023-05-01 00:00:00'
SET @end_date = GETDATE()
WHILE @start_date <= @end_date
BEGIN
SET @WATER_TOP = '231.9' + CAST(FLOOR(RAND()*999999) AS VARCHAR(255))
SET @WATER_LEVEL = '129.7' + CAST(FLOOR(RAND()*999999) AS VARCHAR(255))
INSERT INTO [B_DAM_WATER_LEVEL] (DAM_ID, SENSOR_ID, WATER_TOP, HOLE_DEPTH, WATER_LEVEL, UPLOAD_TIME)
VALUES (@DAM_ID, @SENSOR_ID, @WATER_TOP, 0, @WATER_LEVEL, @start_date)
SET @start_date = DATEADD(HOUR, 1, @start_date)
END
```
希望能对您有所帮助!
优化如下代码:#!/bin/bash . ~/.bashrc sql_file_name=$1 etl_dt=$2 start_offset=`expr $3 + 1` end_offset=`expr $4 + 1` . ${common_path}/edw_function.sh #加载函数脚本 . ${common_path}/edw_setting.sh #加载常用变量 start_time=`DATEADD ${etl_dt} ${start_offset} 1 2` end_time=`DATEADD ${etl_dt} ${end_offset} 1 2` export start_time export end_time table_name=`echo ${sql_file_name:11}` downlaod_sql_file=/dmcp/nas/edw/hql/gp_download/${sql_file_name}.sql if [ ! -e ${downlaod_sql_file} ];then echo "${downlaod_sql_file} not fuound" exit 99 fi exec_file=/dmcp/nas/edw/exec/${today_dt_1}/${sql_file_name}_exec.sql data_path=/data/gp_download/${table_name} if [ -e $exec_file ];then rm -f $exec_file fi envsubst < ${downlaod_sql_file} > ${exec_file} rm -f ${data_path}/0* hive -f ${exec_file} if [[ $? -ne 0 ]] then curr_time=`date +"%Y-%m-%d %H:%M:%S"` echo "${curr_time} download ${table_name} failed" exit 99 else curr_time=`date +"%Y-%m-%d %H:%M:%S"` echo "${curr_time} download ${table_name} succeeded" fi
优化后的代码如下:
```bash
#!/bin/bash
set -euo pipefail
# 加载函数脚本和常用变量
common_path=/path/to/common
. "${common_path}/edw_function.sh"
. "${common_path}/edw_setting.sh"
# 解析参数
sql_file_name=$1
etl_dt=$2
start_offset=$(( $3 + 1 ))
end_offset=$(( $4 + 1 ))
table_name=${sql_file_name:11}
download_sql_file=/dmcp/nas/edw/hql/gp_download/${sql_file_name}.sql
exec_file=/dmcp/nas/edw/exec/${today_dt_1}/${sql_file_name}_exec.sql
data_path=/data/gp_download/${table_name}
# 检查下载 SQL 文件是否存在
if [ ! -e "${download_sql_file}" ]; then
echo "${download_sql_file} not found"
exit 99
fi
# 生成执行 SQL 文件
if [ -e "${exec_file}" ]; then
rm -f "${exec_file}"
fi
envsubst < "${download_sql_file}" > "${exec_file}"
# 删除旧数据
rm -f "${data_path}/0*"
# 执行 Hive SQL
if hive -f "${exec_file}"; then
curr_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "${curr_time} download ${table_name} succeeded"
else
curr_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "${curr_time} download ${table_name} failed"
exit 99
fi
```
优化点如下:
1. 添加 `set -euo pipefail`,使得脚本在发生错误时立即退出。
2. 使用双引号包裹变量,以避免由空格引起的解析错误。
3. 使用 `$(( ))` 表示算术表达式。
4. 修改变量名,使其更具有可读性。
5. 将日志输出提取出来,使代码更加清晰。
6. 删除了一些不必要的条件判断,如文件是否存在的判断已经在第 12 行执行了,没有必要在第 22 行重复判断。
阅读全文