Mysql时间操作的SQL-比较/Format

查询当天的所有数据
SELECT * FROM 表名 WHERE DATEDIFF(字段,NOW()) = 0
SELECT * FROM 表名 WHERE to_days(时间字段名) = to_days(now());
查询昨天的所有数据
SELECT * FROM 表名 WHERE DATEDIFF(字段,NOW())=-1
SELECT * FROM 表名 WHERE TO_DAYS(NOW()) - TO_DAYS(时间字段名) = 1
查询未来第n天的所有数据
//当n为负数时,表示过去第n天的数据
SELECT * FROM 表名WHERE DATEDIFF(字段,NOW())=n
查询未来n天内所有数据
//n天内
SELECT * FROM 表名 WHERE DATEDIFF(字段,NOW())<n AND DATEDIFF(字段,NOW())>=0
查询出今天,年月日
SELECT DATE_SUB(CURDATE(), INTERVAL 0 DAY)
几个小时内的数据
DATE_SUB(NOW(), INTERVAL 5 HOUR)
7天
SELECT * FROM 表名 wher DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(时间字段名)
近30天
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(时间字段名)
本月
SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名, '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' )
上一月
SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( 时间字段名, '%Y%m' ) ) =1
查询过去n天内所有数据
//包含当天
SELECT * FROM 表名 WHERE DATEDIFF(字段,NOW())<=0 AND DATEDIFF(字段,NOW())>-n
//不包含当天
SELECT * FROM 表名 WHERE DATEDIFF(字段,NOW())<0 AND DATEDIFF(字段,NOW())>-n
DATEDIFF函数说明:
DATEDIFF() 函数用于返回两个日期之间的天数。 语法:DATEDIFF(date1,date2) date1 和 date2
参数是合法的日期或日期/时间表达式。 注释: 
1. 只有值的日期部分参与计算。 
2. 当日期date1<date2时函数返回值为正数,date1=date2时函数返回值为0,date1>date2 时函数返回值为负数。
3. Mysql的DATEDIFF只有两个参数。SQL Server有三个参数,详细内容可见:SQL Date函数

在mysql使用过程中,日期一般都是以datetime、timestamp等格式进行存储的,但有时会因为特殊的需求或历史原因,日期的存储格式是varchar,那么我们该如何处理这个varchar格式的日期数据呢

使用函数STR_TO_DATA(str,format)
时间字段为Greens_Data 类型为 varchar

查询指定一段时间中的数据并排序
1、第一种

函数STR_TO_DATE(str,format):将字符串转为时间格式

SELECT Greens_ID,Greens_Date FROM greens
WHERE STR_TO_DATE(Greens_Date,'%Y-%m-%d') BETWEEN '2019-08-01' AND '2019-10-01'
ORDER BY Greens_Date DESC


2、第二种

SELECT Greens_ID,Greens_Date FROM greens
WHERE STR_TO_DATE('开始时间','%Y-%m-%d') AND STR_TO_DATE('结束时间','%Y-%m-%d')
ORDER BY STR_TO_DATE('时间字段名','%Y-%m-%d') DESC


函数DATE_FORMAT(str,format):将时间格式转为字符串
函数NOW():返回格式为yyyy-mm-dd HH:MM:ss

函数CURDATE():返回格式为yyyy-mm-dd

查询本月

SELECT * FROM greens WHERE DATE_FORMAT( Greens_Date, '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' )


查询上一月数据:

SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( 时间字段名, '%Y%m' ) ) =1


查询今日数据:

select * from 表名 where to_days(时间字段名) = to_days(now());


查询昨日数据:

SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1


查询本年数据

select * from `ht_invoice_information` where YEAR(create_date)=YEAR(NOW());


查询本周数据:

SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,'%Y-%m-%d')) = YEARWEEK(now());


查询上周数据:

SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,'%Y-%m-%d')) = YEARWEEK(now())-1;

### SQL语法错误1064分析 SQL语法错误`1064`通常表示MySQL无法解析查询中的某些部分。具体到此问题,错误提示为 `near '// ----------------------------' at line 18`,这表明在第18行附近存在未被识别的语句或结构。 #### 错误原因分析 1. **单行注释符使用不当** 在MySQL中,单行注释应以双短横线 (`--`) 开头,并紧跟一个空格[^1]。如果直接使用两个斜杠 (`//`) 或者缺少后续空格,则可能导致语法错误。 2. **版本兼容性问题** 不同版本的MySQL可能对特定语法的支持程度不同。例如,较新的MySQL版本支持更多扩展功能,而旧版则可能存在限制[^2]。Navicat Premium作为数据库管理工具,在导出脚本时可能会生成针对高版本MySQL优化的内容,这些内容未必能完全适配低版本MySQL服务器。 3. **字符编码冲突** 如果源文件保存时使用的编码格式与目标数据库设置不符(比如UTF-8 vs GBK),也可能引发隐性的语法异常[^3]。 --- ### 解决方案 以下是几种可行的方法来修正该类问题: #### 方法一:调整单行注释形式 将所有形似`// 注释文字`的部分替换为标准写法即`-- 注释文字`并确保每条记录前都有至少一个空白间隔。例如: ```sql -- ---------------------------- -- Table structure for example_table -- ---------------------------- DROP TABLE IF EXISTS `example_table`; CREATE TABLE `example_table` ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(50), PRIMARY KEY (id) ); ``` #### 方法二:升级/降级MySQL服务端程序 确认当前运行环境所依赖的具体MySQL发行号之后再决定是否有必要更新至最新稳定发布或者回退到先前已知良好状态下的构建实例[^4]。可以通过执行命令`SELECT VERSION();`获取现有部署的信息。 #### 方法三:修改Navicat配置选项 当利用Navicat创建迁移任务之前,请仔细核查其高级属性面板里关于目标平台设定项是否存在偏差之处。特别是“Compatibility Mode”字段应当依据实际需求选择恰当的目标数据库引擎类型及其对应的主要特性集合[^5]。 #### 方法四:手动清理多余元数据标记 有时为了便于阅读理解复杂DDL定义文档,开发者习惯于加入大量辅助说明性质的小节划分标签。然而这部分额外附加物往往并非严格意义上的有效SQL组成部分,因此建议移除它们后再尝试重新加载整个批次指令集。 --- ### 示例代码片段展示如何规范化处理后的SQL脚本样式 下面给出一段经过整理后更加贴近常规操作习惯的标准模板供参考: ```sql /* * File Name: schema_definition.sql */ SET FOREIGN_KEY_CHECKS=0; -- Drop existing table if it exists to prevent errors on creation. DROP TABLE IF EXISTS `users`; -- Create new users table with defined columns and constraints. CREATE TABLE `users` ( user_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Unique identifier', username CHAR(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT 'Login account name.', password_hash BINARY(60) NOT NULL COMMENT 'Hashed value of the entered passcode.', created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Record insertion timestamp.', UNIQUE INDEX idx_username(username ASC), -- Enforce uniqueness per login ID field entry level. PRIMARY KEY pk_user(user_id ASC USING BTREE) ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC AVG_ROW_LENGTH=768 MAX_ROWS=9223372036854775807; ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值